我正在使用CursorAdapter
来填充ListView
。我通过从Cursor
获取数据的基本CursorLoader
得到ContentProvider
。现在,当我Cursor
的{{1}}加载了onLoadFinished
时,我在LoaderCallbacks<Cursor>
和我的setNotificationUri()
上拨打Cursor
,我每当发生数据库更改时,都会调用ContentProvider
。
理想的行为是,只要数据库中有新数据,我就会收到通知,并为用户提供重新加载getContext().getContentResolver().notifyChange(MY_CONTENT_URI, null)
并重新填充Cursor
的选项。关于我如何处理这个问题的任何建议?
答案 0 :(得分:1)
你想要的是通知另一个结构而不是ListView
,不是吗?
即。这将是通过ListView
CursorLoader
的代码
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// Swap the new cursor in. (The framework will take care of closing the old cursor
// once we return.)
dataAdapter.notifyDataSetChanged(); // <- Here we notify the change to Adapter
listView.setAdapter(dataAdapter); // <- Then we set ListView with Adapter
dataAdapter.swapCursor(data);
}
因此,您所需要的只是覆盖notifyDataSetChanged
的{{1}}方法,这样,此类继承自CursorAdapter
,此类具有此类方法。您可以通过什么方式和通知来执行。
然后您应该替换BaseAdapter
,因为您希望在上面的代码中收到通知。
在ListView
之前,您可以调用对话框以询问用户是否应填充ListView。我是这样做的。
我希望,这可以帮到你。
亲切的问候。
P.S。我选择listview.setAdapter(dataAdapter)
,您可以将此方法用于其他notify-Methods,只需看看它们是否为适配器实现。
答案 1 :(得分:0)
这可能不适用于标准CursorLoader
。 CursorLoader
实现自己的ContentObserver,代表您注册。当Uri
上有通知时,加载程序将自动强制重新加载光标。
我看到两种可能性:
onLoadFinished
的{{1}}中,您可以向用户显示该选项,并仅根据其响应更改适配器中的光标。LoaderCallbacks
实现,它在想要重新加载数据时提供一些钩子。您可以从检查source code for CursorLoader及其超类开始。特别是,内部ContentObserver调用的方法CursorAdapter
似乎是一个添加您想要的额外行为的好地方。