安卓-游标加载器如何知道底层数据集已更改?

4

我正在学习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 与此无关,请参见 http://codeshare.io/wJYDr,当您单击按钮时,您将看到您的加载器重新加载新数据。 - pskink
是的,我明白,正如我所说的,视频和API都表示您可以将观察结果留给加载器。我不是在询问这个,我在问观察机制。不过算了,我会假设这归结于某种观察者模式,并且一切都会被神奇地处理好。 - berimbolo
2个回答

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

谢谢 Steve,非常有帮助! - berimbolo

0

我不认为我会真正理解这个机制,但是API中指出:

“加载器将监视数据的更改,并通过此处的新调用向您报告它们。您不应自己监视数据。例如,如果数据是Cursor并且您将其放置在CursorAdapter中,请使用CursorAdapter(android.content.Context,android.database.Cursor,int)构造函数,而不传递FLAG_AUTO_REQUERY或FLAG_REGISTER_CONTENT_OBSERVER(即,对于标志参数使用0)。这可以防止CursorAdapter自己观察Cursor,因为当发生更改时,您将通过另一个调用获得新的Cursor。”

我可以认为这只是为我完成的,每当底层数据发生更改时,就会触发对onLoadFinished的新调用,进而调用:

mForecastAdapter.swapCursor(data);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接