【问题标题】:Android - How does cursor loader know underlying dataset has changed?Android - 游标加载器如何知道底层数据集已更改?
【发布时间】:2015-12-26 14:28:56
【问题描述】:

我正在努力学习 Android 编程,并且一直在使用 Udacity Sunshine 应用程序。

有些事情让我很困惑。我有一个内容提供程序,它执行插入、删除、选择等操作,我有一个游标加载器,它也是一个片段,我有一个游标适配器,除了加载器如何知道数据已更改之外,大部分都是有意义的。

在内容提供者的更新方法中,我假设它是在通知某些数据已更改:

if (rowsUpdated != 0) {
        getContext().getContentResolver().notifyChange(uri, null);
    }

加载器在 onCreateLoader 方法中设置:

return new CursorLoader(
            getActivity(),
            weatherForLocationUri,
            FORECAST_COLUMNS,
            null,
            null,
            sortOrder
    );

加载的 URI 与用于更新的 URI 不同,那么加载器如何知道下面的数据已更改??

适配器在当前光标上有一个句柄,它在 onLoadFinished 中设置:

mForecastAdapter.swapCursor(data);

最后,列表视图本身在光标适配器上有一个句柄:

mListView.setAdapter(mForecastAdapter);

我只是不明白加载器如何通过这种机制知道数据已更改,以及它如何通知适配器指示它重绘 UI?

另外,如果我对此的理解有任何错误,请纠正我!

【问题讨论】:

  • CursorAdapter与它无关,见codeshare.io/wJYDr,当你点击按钮你会看到你的loader重新加载新数据
  • 是的,我明白,正如我所说,视频和 API 都说您可以将观察结果留给加载程序。我不是在问这个,而是在问观察的机制。没关系,我只是假设它归结为某种观察者模式,并且对我来说都是神奇的处理。

标签: java android adapter loader


【解决方案1】:

好吧,我认为我不会得到真正的机制,但正如 API 所述:

"Loader 将监控数据的变化,并通过这里的新调用向您报告。您不应该自己监控数据。例如,如果数据是 Cursor,并且您将其放在 CursorAdapter 中,请使用CursorAdapter(android.content.Context, android.database.Cursor, int) 构造函数没有传入 FLAG_AUTO_REQUERY 或 FLAG_REGISTER_CONTENT_OBSERVER(即,使用 0 作为 flags 参数)。这可以防止 CursorAdapter 自己观察游标,这不是必需的,因为当发生更改时,您将获得一个新的 Cursor 在此处再次调用。”

我可以将其视为刚刚为我完成的给定,并且每当下面的数据发生变化时,就会触发对 onLoadFinished 的新调用,进而调用:

mForecastAdapter.swapCursor(data);

【讨论】:

    【解决方案2】:

    游标将自己注册为通知死者,这意味着当根 URI 收到更改通知时,也会通知 URI 的死者,死者可以是任何带有附加路径信息的东西。

    【讨论】:

    • 干杯史蒂夫,帮助很大!
    猜你喜欢
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多