即使我调用notifyChange(uri,null),ListView也不会更新;虽然内容提供商

时间:2015-06-11 17:16:00

标签: android android-contentprovider android-cursoradapter

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

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

我在我的活动中实施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覆盖(类扩展CursorAdapter

在我的服务中,我致电service.getContentResolver().insert(...,values),但活动ListView不会更新,除非我关闭并重新打开该应用。

导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:0)

我设法解决了这个问题,但是发布在这里,以防将来有人帮助。

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

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