Android 与 SimpleCursorAdapter 和 ContentProvider 一起使用的加载程序未更新
Android Loader used with SimpleCursorAdapter and ContentProvider not updating
我有一个列表片段,它使用加载器和 SimpleCursorAdapter 从 ContentProvider 加载数据。我认为我已经正确地遵循了 google 示例给出的指示,但是当基础数据发生变化时我的 ListView 没有更新。这就是我正在做的事情:
ContentProvider
@Override
public synchronized Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
...
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
ListFragment
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
String[] dbColumns = new String[] { CheckpointsView.COL_TYPE, CheckpointsView.COL_DESCRIPTION };
int[] listColumnIds = new int[] { R.id.lci_img_icon, R.id.lci_txt_description };
adapter = new SimpleCursorAdapter(getActivity(), R.layout.listview_checkpoints_item, null, dbColumns, listColumnIds, 0);
...
setListAdapter(adapter);
getLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
CursorLoader cursorLoader = new CursorLoader(
getActivity(),
CheckpointsView.CONTENT_URI,
CheckpointsView.LOADER_PROJECTION,
whereClause,
null,
null
);
return cursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
在我知道刚刚添加了数据的代码中,我尝试调用
adapter.notifyDataSetChanged();
,
但也没用。
刷新列表的唯一方法是退出 activity 并重新启动它,或者通过写入
手动重新创建加载程序
getLoaderManager().destroyLoader(0);
getLoaderManager().initLoader(0, null, GreenScanFragment.this);
我是不是漏掉了什么?
我傻了!花了这么多时间后,我不得不 post 一个问题才能自己找到答案。如果我在更新数据的地方调用 context.getContentResolver().notifyChange(CheckpointsView.CONTENT_URI, null, false);
,问题就解决了。
我有一个列表片段,它使用加载器和 SimpleCursorAdapter 从 ContentProvider 加载数据。我认为我已经正确地遵循了 google 示例给出的指示,但是当基础数据发生变化时我的 ListView 没有更新。这就是我正在做的事情:
ContentProvider
@Override
public synchronized Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
...
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
ListFragment
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
String[] dbColumns = new String[] { CheckpointsView.COL_TYPE, CheckpointsView.COL_DESCRIPTION };
int[] listColumnIds = new int[] { R.id.lci_img_icon, R.id.lci_txt_description };
adapter = new SimpleCursorAdapter(getActivity(), R.layout.listview_checkpoints_item, null, dbColumns, listColumnIds, 0);
...
setListAdapter(adapter);
getLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
CursorLoader cursorLoader = new CursorLoader(
getActivity(),
CheckpointsView.CONTENT_URI,
CheckpointsView.LOADER_PROJECTION,
whereClause,
null,
null
);
return cursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
在我知道刚刚添加了数据的代码中,我尝试调用
adapter.notifyDataSetChanged();
,
但也没用。
刷新列表的唯一方法是退出 activity 并重新启动它,或者通过写入
手动重新创建加载程序getLoaderManager().destroyLoader(0);
getLoaderManager().initLoader(0, null, GreenScanFragment.this);
我是不是漏掉了什么?
我傻了!花了这么多时间后,我不得不 post 一个问题才能自己找到答案。如果我在更新数据的地方调用 context.getContentResolver().notifyChange(CheckpointsView.CONTENT_URI, null, false);
,问题就解决了。