在不更新ListView的情况下通知游标更改

时间:2014-07-29 13:43:53

标签: android android-listview android-contentprovider android-cursor android-cursorloader

我正在使用CursorAdapter来填充ListView。我通过从Cursor获取数据的基本CursorLoader得到ContentProvider。现在,当我Cursor的{​​{1}}加载了onLoadFinished时,我在LoaderCallbacks<Cursor>和我的setNotificationUri()上拨打Cursor,我每当发生数据库更改时,都会调用ContentProvider

理想的行为是,只要数据库中有新数据,我就会收到通知,并为用户提供重新加载getContext().getContentResolver().notifyChange(MY_CONTENT_URI, null)并重新填充Cursor的选项。关于我如何处理这个问题的任何建议?

2 个答案:

答案 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)

这可能不适用于标准CursorLoaderCursorLoader实现自己的ContentObserver,代表您注册。当Uri上有通知时,加载程序将自动强制重新加载光标。

我看到两种可能性:

  1. 允许加载程序重新加载游标。在onLoadFinished的{​​{1}}中,您可以向用户显示该选项,并仅根据其响应更改适配器中的光标。
  2. 编写您自己的LoaderCallbacks实现,它在想要重新加载数据时提供一些钩子。您可以从检查source code for CursorLoader及其超类开始。特别是,内部ContentObserver调用的方法CursorAdapter似乎是一个添加您想要的额外行为的好地方。