2
을 호출 할 때 Recyclerview ITEM 업데이트

데이터베이스가 변경 될 때 데이터를 업데이트하기위한 다음 링크를 읽었습니다.Android : ContentObserver가

What's the mechanism of setNotificationUri?

그와 함께 알림을 받으려면 나는 RecyclerView를 다음과 같이 업데이트했습니다.

/** 
* A simple {@link Fragment} subclass. 
*/ 
public class OrderListFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> { 

    /** 
    * Cursor Loader ID 
    */ 
    private int LOADER_ID = 2; 

    /** 
    * Observer... 
    */ 
    OrderObserver orderObserver = null; 

    @Override 
    public void onResume() { 
     super.onResume(); 
     /** 
     * Observer Declaration... 
     */ 
     orderObserver = new OrderObserver(new Handler()); 
     LOGD("Registered......"); 
     getActivity().getContentResolver().registerContentObserver(KOOPSContentProvider.CONTENT_URI_ORDER, true, orderObserver); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     if (orderObserver != null) { 
      LOGD("Unregistered..."); 
      getActivity().getContentResolver().unregisterContentObserver(orderObserver); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_order_list, container, false); 

     orderListBinding = DataBindingUtil.bind(view); 

     /** 
     * Getting Context 
     */ 
     mContext = getActivity().getApplicationContext(); 

     /** 
     * Setup with RecyclerView 
     */ 
     layoutManager = new HPLinearLayoutManager(mContext); 

     /** 
     * Adapter... 
     */ 
     orderListAdapter = new OrderRecyclerAdapter(mContext, orderCursor); 

     /** 
     * RecyclerView Binding 
     */ 
     orderListBinding.orderListRecyclerView.setLayoutManager(layoutManager); 
     orderListBinding.orderListRecyclerView.setHasFixedSize(true); 
     orderListBinding.orderListRecyclerView.setAdapter(orderListAdapter); 

     /** 
     * First Time init Loader 
     */ 
     orderQueryData = new Bundle(); 
     orderQueryData.putString("searchString", ""); 

     /** 
     * Adding Bundle in Loader and then Call 
     */ 
     getActivity().getSupportLoaderManager().initLoader(LOADER_ID, orderQueryData, this); 

     /*********************************/ 
     // Inflate the layout for this fragment 
     return view; 
    } 



    /** 
    * Get Data From Local 
    */ 
    private void getDataFromLocal() { 
     /** 
     * Adding Bundle in Loader and then Call 
     */ 
     getActivity().getSupportLoaderManager().restartLoader(LOADER_ID, orderQueryData, this); 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     final Uri CONTENT_URI = KOOPSContentProvider.CONTENT_URI_ORDER.buildUpon() 
       .appendQueryParameter(KOOPSContentProvider.QUERY_PARAMETER_OFFSET, String.valueOf(offset)) 
       .build(); 

     return new CursorLoader(mContext, CONTENT_URI, null, null, null, null); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 

     int length = data.getCount(); 

     LOGD("Length of Orders in Local : " + length); 

      /*** 
      * Binding Data to Adapter 
      * OFFSET is 0 whenever search for orders of sync 
      */ 
      if (offset == 0) { 
       ((OrderRecyclerAdapter) orderListBinding.orderListRecyclerView.getAdapter()).swapCursor(data); 
      } else { 
       Cursor cursor = ((OrderRecyclerAdapter) orderListBinding.orderListRecyclerView.getAdapter()).getCursor(); 

       //fill all existing in adapter 
       ArrayList<String> first = new ArrayList<>(Arrays.asList(Order.ORDER_COLUMNS)); 
       first.add("amount"); 

       MatrixCursor mx = new MatrixCursor(first.toArray(new String[first.size()])); 
       fillMx(cursor, mx); 

       //fill with additional result 
       fillMx(data, mx); 
       ((OrderRecyclerAdapter) orderListBinding.orderListRecyclerView.getAdapter()).swapCursor(mx); 
      } 

      /** 
      * Check Length of Data from Local 
      */ 

    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> loader) { 

    } 

    /** 
    * Merging New Cursor with Old Cursor... 
    * 
    * @param data data 
    * @param mx matrix cursor 
    */ 
    private void fillMx(Cursor data, MatrixCursor mx) { 
     if (data == null) 
      return; 

     data.moveToPosition(-1); 

     while (data.moveToNext()) { 
      mx.addRow(new Object[]{ 

        data.getString(data.getColumnIndex(MOBILE_ID)), 
        data.getString(data.getColumnIndex(SERVER_ID)), 
        data.getString(data.getColumnIndex(ORDER_ORDER_DATE)), 
        data.getString(data.getColumnIndex(ORDER_ACCOUNT_ID)), 
        data.getString(data.getColumnIndex(ORDER_CREATED_BY)), 
        data.getString(data.getColumnIndex(ORDER_ORDER_STATUS)), 
        data.getString(data.getColumnIndex(ORDER_SEEN)), 
        data.getString(data.getColumnIndex(ORDER_ITP)), 
        data.getString(data.getColumnIndex(ORDER_UTP)), 
        data.getString(data.getColumnIndex(ORDER_MITP)), 
        data.getString(data.getColumnIndex("amount")), 
      }); 
     } 
    } 

    /** 
    * My Observer.... 
    */ 
    class OrderObserver extends ContentObserver { 

     /** 
     * Creates a content observer. 
     * 
     * @param handler The handler to run {@link #onChange} on, or null if none. 
     */ 
     OrderObserver(Handler handler) { 
      super(handler); 
     } 

     @Override 
     public void onChange(boolean selfChange) { 
      this.onChange(selfChange, null); 
      LOGD("Changed....."); 
      // Override this method to listen to any changes 
     } 

     @Override 
     public void onChange(boolean selfChange, Uri uri) { 
      // depending on the handler you might be on the UI 
      // thread, so be cautious! 
      LOGD("Changed....." + uri); 
      offset = 0; 
      hasLocal = true; 
      getDataFromLocal(); 

      // HERE I WANT TO DO SOMETHING LIKE CHANGE VALUES ONLY WHICH ROW IS UPDATED...... 
      // HOW CAN I UPDATE ROW ONLY...... 

     } 
    } 
} 

현재 데이터베이스에서 모든 레코드를 업데이트하고 있습니까? 데이터베이스에 삽입/업데이트 된 행을 어떻게 업데이트 할 수 있습니까? 나는 전체를 새롭게하고 싶지 않다 RecyclerView?

ContentObserver에서 업데이트 된 행만 알리는 메커니즘이 있습니까?

답변

0

onChange 메서드에는 변경된 내용을 식별하기위한 Uri 매개 변수가 있습니다.

콘텐츠 제공 업체가 올바르게 작성 되었다면 Uri는 변경된 사항을 고유하게 식별해야합니다. 예를 들어, 테이블 items을 가지고 있고 urier content://com.application.sample/items/42을받은 경우 변경된 항목 # 42라는 것을 알고 있습니다. 당신이 당신에게 컨텐츠 공급자를 수정할 수있는 경우

, 당신도 더 나아가 변화가 무엇인지 서로 다른 URI를 할 수 :

  • content://com.application.sample/items/42/deleted
  • content://com.application.sample/items/42/inserted
  • content://com.application.sample/items/42/updated

사용 어댑터에서 해당 notify??? 메소드를 트리거 할 수 있습니다.