我有一个ContentProvider来管理sqlite数据库。在ContentProvider的query()方法中,我注册了通知:
cursor.setNotificationUri(getContext().getContentResolver(), uri);
如果插入了一个条目,我会通过以下调用通过ContentProvider中的insert()方法通知所有观察者:
getContext().getContentResolver().notifyChange(uri, null);
RecyclerView位于片段中,片段实现了LoaderManager.LoaderCallbacks以允许对更改做出反应。
@Override
public Loader<Cursor> onCreateLoader(int loader, Bundle bundle) {
switch (loader) {
case URL_LOADER:
return new CursorLoader(getActivity(), DataProvider.PERSONS_URI,
null, null, null, null);
default:
return null;
}
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
this.mAdapter.swapCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
this.mAdapter.swapCursor(null);
}
这些是我的LoaderCallbacks。如果我通过ContentResolver插入一个元素onLoadFinished被调用,但UI没有更新。当我重新启动应用程序时,条目可见。支持RecyclerView游标所需的适配器基于这个要点。 https://gist.github.com/Shywim/127f207e7248fe48400b