我正在使用第一种方法开发基于Google IO presentation架构的应用。基本上我有一个由Service
数据库支持的ContentProvider
,SQLite
,我也使用Loader
s。
我需要一种在我的数据库发生更改时更新UI的方法。例如,用户可能想要将项目添加到他的购物篮中。将项目ID插入到篮子表后,我想更新UI。我应该使用什么方法?到目前为止,我在ContentObserver
上看到的信息非常少。它是要走的路吗?
答案 0 :(得分:7)
在query
的{{1}}方法中,将一个侦听器附加到返回的游标:
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);
或Adapter
的{{1}}。
<强>的CursorAdapter 强>
在ListView
RecyclerView
<强> ArrayAdapter 强>
在onLoadFinished(Loader loader, Cursor data)
mAdapter.swapCursor(data);
<强> RecyclerView.Adapter 强>
在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();
以不同的方式阅读from here以通知onLoadFinished(Loader loader, Cursor data)
。
答案 1 :(得分:2)
如果您使用的是列表,则可以再次填充适配器并将其设置为列表。或者尝试通知数据集更改。