即使我调用 notifyChange(uri, null); ListView 也不会更新;通过内容提供者

ListView won't update even if I call notifyChange(uri, null); though content provider

当新数据添加到内容提供程序时,我无法尝试刷新我的 ListView。

阅读关于这个问题的类似帖子,我确保在我的插入方法上使用 getContext().getContentResolver().notifyChange(uri, null); 并且 c.setNotificationUri(getContext().getContentResolver(), uri);关于我的查询方式(说到内容提供者class)。

我在 activity:

中实现了 LoaderManager.LoaderCallbacks<Cursor>
    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        return new CursorLoader(ChatWindowActivity.this,
                                DatabaseContentProvider.getConversationUri(conversationId),
                                PROJECTION, null, null, null);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        switch (loader.getId()) {
            case LOADER_ID:
                mAdapter.swapCursor(cursor);
                break;
            }
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        mAdapter.swapCursor(null);
    }
}

我正在使用自定义游标适配器,覆盖了 getItemViewTypegetViewTypeCountnewViewbindView(class 扩展 CursorAdapter)

在我的服务中我调用 service.getContentResolver().insert(...,values),但是 activity ListView 不会更新,除非我关闭并重新打开应用程序。

可能是什么原因造成的?

我已经设法解决了这个问题,但在此发帖以防将来对某人有所帮助。

问题出在 getContext().getContentResolver().notifyChange(uri, null);。内容提供商将通知仅 specific URI 发生了更改。

所以我必须确保 CursorLoader 和插入调用在完全相同的 URI 上工作,这样才能工作。即使像“/contacts/1”与“/contacts”这样的微小差异也不会通知游标它已更改。