我正在使用第一种方法开发基于Google IO演示架构的应用。基本上我有一个Service
,ContentProvider
通过支持SQLite
DB,我也用Loader
秒。
当数据库发生更改时,我需要一种更新UI的方法。例如,用户可能想将商品添加到他的购物篮中。将项目ID插入购物篮表后,我想更新UI。我应该使用哪种方法?ContentObserver
到目前为止,我所看到的信息很少。这是要走的路吗?
在query
你的方法ContentProvider
附加一个侦听返回光标:
Cursor cursor = queryBuilder.query(dbConnection, projection, selection, selectionArgs, null, null, sortOrder);
cursor.setNotificationUri(getContext().getContentResolver(), uri);
然后在你的insert
/ update
/delete
方法使用这样的代码:
final long objectId = dbConnection.insertOrThrow(ObjectTable.TABLE_NAME, null, values);
final Uri newObjectUri = ContentUris.withAppendedId(OBJECT_CONTENT_URI, objectId );
getContext().getContentResolver().notifyChange(newObjectUri , null);
您CursorLoader
将收到通知,并且OnLoadFinished(Loader, Cursor)
将再次被呼叫。
如果您不使用Loader
,那么ContentObserver
方法是走,用几行代码通知您数据库更改(但您需要手动重新查询)。
private ContentObserver objectObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
restartObjectLoader();
}
};
请记住致电onResume()
:
getContentResolver().registerContentObserver(ObjectProvider.OBJECT_CONTENT_URI, false, objectObserver);
并在onPause()
:
getContentResolver().unregisterContentObserver(objectObserver);
更新:UI更改这是一个较大的主题,因为它取决于Adapter
您用来填充ListView
或的RecyclerView
。
CursorAdapter输入onLoadFinished(Loader loader, Cursor data)
mAdapter.swapCursor(data);
ArrayAdapter输入onLoadFinished(Loader loader, Cursor data)
Object[] objects = transformCursorToArray(data); //you need to write this method
mAdapter.setObjects(objects); //You need to wrie this method in your implementation on the adapter
mAdapter.notifyDataSetChange();
RecyclerView.Adapter输入onLoadFinished(Loader loader, Cursor data)
Object[] objects = transformCursorToArray(data); //you need to write this method
//Here you have more mAdapter.notify....()
从此处阅读有关通知的其他方法RecyclerView.Adapter
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句