Android:调用ContentObserver时更新Recyclerview项

Android:调用ContentObserver时更新Recyclerview项,android,android-recyclerview,android-contentprovider,android-cursorloader,contentobserver,Android,Android Recyclerview,Android Contentprovider,Android Cursorloader,Contentobserver,我已经阅读了以下当数据库发生变化时更新数据的链接 因此,通过ContentObserver成功地完成了该操作,我的片段得到了通知,我已经通过以下方式更新了RecyclerView /** * A simple {@link Fragment} subclass. */ public class OrderListFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {

我已经阅读了以下当数据库发生变化时更新数据的链接

因此,通过ContentObserver成功地完成了该操作,我的片段得到了通知,我已经通过以下方式更新了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......

        }
    }
}
/**
*一个简单的{@link Fragment}子类。
*/
公共类OrderListFragment扩展片段实现LoaderManager.LoaderCallbacks{
/**
*游标加载程序ID
*/
私有整数加载器_ID=2;
/**
*观察员。。。
*/
OrderObserver=null;
@凌驾
恢复时公开作废(){
super.onResume();
/**
*观察员声明。。。
*/
orderObserver=newOrderObserver(newHandler());
LOGD(“注册……”);
getActivity().getContentResolver().registerContentObserver(koopContentProvider.CONTENT\u URI\u ORDER,true,orderObserver);
}
@凌驾
公共无效暂停(){
super.onPause();
if(orderObserver!=null){
LOGD(“未注册…”);
getActivity().getContentResolver().unregisterContentObserver(orderObserver);
}
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\u order\u list,container,false);
orderListBinding=DataBindingUtil.bind(视图);
/**
*获取上下文
*/
mContext=getActivity().getApplicationContext();
/**
*使用RecyclerView设置
*/
layoutManager=新的HPLinearLayoutManager(mContext);
/**
*适配器。。。
*/
orderListAdapter=new OrderRecyclerAdapter(mContext,orderCursor);
/**
*循环视图绑定
*/
orderListBinding.orderListRecyclerView.setLayoutManager(layoutManager);
orderListBinding.orderListRecyclerView.setHasFixedSize(true);
orderListBinding.orderListRecyclerView.setAdapter(orderListAdapter);
/**
*第一次初始化加载程序
*/
orderQueryData=新绑定();
putString(“searchString”和“”);
/**
*在加载程序中添加Bundle,然后调用
*/
getActivity().getSupportLoaderManager().initLoader(加载程序ID,orderQueryData,this);
/*********************************/
//为该碎片膨胀布局
返回视图;
}
/**
*从本地获取数据
*/
私有void getDataFromLocal(){
/**
*在加载程序中添加Bundle,然后调用
*/
getActivity().getSupportLoaderManager().restartLoader(加载程序ID,orderQueryData,this);
}
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
final Uri CONTENT\u Uri=KOOPSContentProvider.CONTENT\u Uri\u ORDER.buildOn()
.appendQueryParameter(KOOPSContentProvider.QUERY_参数_偏移量,String.valueOf(偏移量))
.build();
返回新的游标装入器(mContext,CONTENT\u URI,null,null,null);
}
@凌驾
public void onLoadFinished(加载器、光标数据){
int length=data.getCount();
LOGD(“本地订单长度:“+长度”);
/***
*将数据绑定到适配器
*每当搜索同步订单时,偏移量为0
*/
如果(偏移量==0){
((OrderRecyclerAdapter)orderListBinding.orderListRecyclerView.getAdapter()).swapCursor(数据);
}否则{
游标游标=((OrderRecyclerAdapter)orderListBinding.orderListRecyclerView.getAdapter()).getCursor();
//填充适配器中的所有现有内容
ArrayList first=新的ArrayList(Arrays.asList(Order.Order_COLUMNS));
第一,添加(“金额”);
MatrixCursor mx=新MatrixCursor(first.toArray(新字符串[first.size()]);
fillMx(光标,mx);
//用额外的结果填充
fillMx(数据,mx);
((OrderRecyclerAdapter)orderListBinding.orderListRecyclerView.getAdapter()).swapCursor(mx);
}
/**
*检查本地数据的长度
*/
}
@凌驾
公共void onLoaderReset(加载器){
}
/**
*正在将新光标与旧光标合并。。。
*
*@param数据
*@param mx矩阵光标
*/
专用void fillMx(光标数据,MatrixCursor mx){
如果(数据==null)
返回;
数据。移动位置(-1);
while(data.moveToNext()){
mx.addRow(新对象[]){
data.getString(data.getColumnIndex(MOBILE_ID)),
data.getString(data.getColumnIndex(服务器ID)),
data.getString(data.getColumnIndex(ORDER\u ORDER\u DATE)),
data.getString(data.getColumnIndex(订单\帐户\ ID)),
data.getString(data.getColumnIndex(ORDER_CREATED_BY)),
data.getString(data.getColumnIndex(订单\订单\状态)),
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(“金额”)),
});
}
}
/**
*我的观察者。。。。
*/
类OrderObserver扩展了ContentObserver{
/**
*创建内容观察者。
*
*@param handler运行{@link#onChange}的处理程序,如果没有,则为null。
*/
OrderObserver(处理程序){
超级(处理器);
}
@越过