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

时间:2015-09-29 07:41:06

标签: java android adapter loader

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

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

在内容提供程序的更新方法中,它执行此操作,我假设它正在通知数据已更改的内容:

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

加载器在onCreateLoader方法中设置:

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

对于用于更新的加载,URI是不同的,但是加载器如何知道数据在下面发生了变化?

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

mForecastAdapter.swapCursor(data);

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

mListView.setAdapter(mForecastAdapter);

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

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

2 个答案:

答案 0 :(得分:2)

游标将自己注册为死者的通知,这意味着当根URI被通知更改时,URI的死者也会被通知,死者可以是任何有其他路径信息的人。

答案 1 :(得分:0)

嗯,我不认为我会得到这个的真正机制,但正如API所述:

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

我可以把它作为刚给我做的一个给定,并且每当下面的数据发生变化时,都会触发对onLoadFinished的新调用,然后调用它:

mForecastAdapter.swapCursor(data);