【问题标题】:Notify cursor change without updating ListView通知光标更改而不更新 ListView
【发布时间】:2014-09-20 22:01:00
【问题描述】:
我正在使用CursorAdapter 填写我的ListView。我通过一个基本的CursorLoader 获得Cursor,它从我的ContentProvider 获取数据。现在,当Cursor 加载到我的LoaderCallbacks<Cursor> 的onLoadFinished 中时,我在Cursor 上调用setNotificationUri(),在我的ContentProvider 中,每当数据库发生更改时我都会调用getContext().getContentResolver().notifyChange(MY_CONTENT_URI, null)已经发生了。
所需的行为是,只要数据库中有新数据,我就会收到通知,并为用户提供重新加载Cursor 和重新填充ListView 的选项。关于如何处理此问题的任何建议?
【问题讨论】:
标签:
android
android-listview
android-contentprovider
android-cursor
android-cursorloader
【解决方案1】:
这可能不适用于标准 CursorLoader。 CursorLoader 实现了自己的 ContentObserver,它代表您注册。当Uri有通知时,加载器会自动强制重新加载光标。
我看到了两种可能性:
- 允许加载程序重新加载光标。在您的
LoaderCallbacks 中的onLoadFinished 中,您可以向用户提供选项,并且仅根据他们的响应更改适配器中的光标。
- 编写您自己的
CursorAdapter 实现,在它想要重新加载数据时提供一些挂钩。您可以从检查source code for CursorLoader 及其超类开始。特别是,由内部 ContentObserver 调用的方法 onContentChanged 似乎是添加您想要的这种额外行为的好地方。
【解决方案2】:
你想要通知另一个结构而不是ListView,不是吗?
即这将是用CursorLoader 通知ListView 的代码
@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);
}
所以,那么你所需要的就是覆盖你的CursorAdapter 的notifyDataSetChanged 方法,这样,这个类就继承自BaseAdapter 并且这个类有这样一个方法。您可以在那里以您通知的方式和内容执行。
那么你只需替换ListView,因为你想在上面的代码中得到通知。
在listview.setAdapter(dataAdapter) 之前,您可以调用一个对话框来询问用户是否应该填充ListView。我会这样做。
希望对你有帮助。
亲切的问候。
附言我选择了notifyDataSetChanged,其他的notify-Methods可以使用这种方式,看是否是为Adapter实现的。