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);,问题就解决了。