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> {
/**
* 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(处理程序){
超级(处理器);
}
@越过