基本上,我有一个带有适配器的RecyclerView,用于填充游标中的数据。我有两个选项来获取项目动画:
使用setHasStableIds(true)
并覆盖getItemId
以返回数据库行的ID,然后在适配器中使用swapCursor
函数将当前光标与新光标交换然后调用notifyDatasetChanged
与选项1类似,但不是简单地交换游标并调用notifyDatasetChanged
,而是迭代旧游标和新游标,比较行以确定添加/删除/更改了哪些行并保持跟踪他们,然后致电notifyItemAdded
,notifyItemChanged
等,以告知适配器具体更新内容
使用选项1,notifyDatasetChanged
将重新绑定效率低下的所有可见项(以及其他一些东西),但是使用选项2,我必须遍历整个光标以确定哪些项已经存在添加/删除,如果光标相当大,这可能还需要一些时间。有没有人对哪个更好的解决方案有什么想法?为什么?
编辑:
为了让事情变得更有趣,我还有第三个选择:
RecyclerView
的孩子来计算),因为其他项目将会启动新光标值被绑定时的值。唯一的问题是它不能用于添加/删除,因此围绕它的方法是在oldCursor.count() != newCursor.count()
进行完整的迭代。如果计数相同,我可以setHasStableIds(false)
,然后即使某个位置的行与之前的行不同,onBindViewHolder
也会处理它。这样做的缺点是ID不稳定,这意味着RecyclerView
必须在某些地方做一些额外的工作
答案 0 :(得分:0)
选项2容易出错。我会选择选项1,保持简单。