通知RecyclerView适配器有关不可见项目更改的正确方法是什么?

时间:2016-02-29 23:16:49

标签: android cursor android-recyclerview adapter

我会尝试尽可能具体。我有一个光标支持的RecyclerView适配器。我正在使用LoaderManager回调来在DB值更改时获取更新,这为我提供了一个新的游标。然后我将新光标与适配器当前保持的光标进行比较,以找出更改的内容,使用适配器中的新光标切换旧光标,然后调用相应的notifyItem(Range)Inserted/Changed/Removed()函数。这很好用,但有些地方我想使用它可以有一些非常大的游标,所以我希望通过找出哪些项目是可见的使用布局管理器优化它,然后只检查这些项目光标用于更改而不是检查每一行。

现在我的问题是,假设我有一个1000行的游标,而我的RecyclerView显示的是行0-10。我可以浏览游标,检查索引0-10处的项目是否有更改/添加/删除,并调用我正在执行的相应的notify()函数,但是不可见的项目呢?我是否必须通知适配器这些行可能有变化,或者我可以安全地忽略它们,当这些行被绑定时它只会使用更新的数据?

为了清晰起见,我的代码流程如下:

我的适配器持有游标,getItemCount只返回cursor.count()ViewHolder绑定代码与cursor.moveToPosition(position)一致,后跟ViewHolder.setFoo(cursor.getString(BAR))之类的内容

当数据库发生变化时,LoaderManager回调会使用更新的游标调用onLoadFinished,然后调用adapter.changeCursor(newCursor)

changeCursor基本上遍历旧游标和新游标以检查更改的内容。这工作正常,但如果光标非常大,可能需要一些时间来循环整个事情,所以我希望能够跳过除可见项目之外的所有内容。如果我这样做,更改工作正常,因为onBindViewHolder将使用更新的游标,但如果添加或删除(不可见)行并且我不调用notifyItemInserted/Removed,则适配器不会了解它并且没有正确处理它,这让我相信我不能做这个优化,我必须循环整个事情来找到添加/删除的行

1 个答案:

答案 0 :(得分:0)

你的直觉是正确的。

您不需要关注不可见的项目。当LayoutManager最终将它们放在屏幕上时,您将在适配器中调用bindViewHolder。在这里,您可以在视图中反映适配器的当前状态(有光标)。