【问题标题】: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】:

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

    我看到了两种可能性:

    1. 允许加载程序重新加载光标。在您的LoaderCallbacks 中的onLoadFinished 中,您可以向用户提供选项,并且仅根据他们的响应更改适配器中的光标。
    2. 编写您自己的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);
      }
      

      所以,那么你所需要的就是覆盖你的CursorAdapternotifyDataSetChanged 方法,这样,这个类就继承自BaseAdapter 并且这个类有这样一个方法。您可以在那里以您通知的方式和内容执行。

      那么你只需替换ListView,因为你想在上面的代码中得到通知。

      listview.setAdapter(dataAdapter) 之前,您可以调用一个对话框来询问用户是否应该填充ListView。我会这样做。

      希望对你有帮助。

      亲切的问候。

      附言我选择了notifyDataSetChanged,其他的notify-Methods可以使用这种方式,看是否是为Adapter实现的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-09
        • 2016-09-24
        • 1970-01-01
        • 2011-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多