我会尝试尽可能具体。我有一个光标支持的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
,则适配器不会了解它并且没有正确处理它,这让我相信我不能做这个优化,我必须循环整个事情来找到添加/删除的行
答案 0 :(得分:0)
你的直觉是正确的。
您不需要关注不可见的项目。当LayoutManager
最终将它们放在屏幕上时,您将在适配器中调用bindViewHolder
。在这里,您可以在视图中反映适配器的当前状态(有光标)。