哪个更昂贵,notifyDatasetChanged()或循环一个大光标?

时间:2016-03-02 23:27:50

标签: android performance cursor android-recyclerview adapter

基本上,我有一个带有适配器的RecyclerView,用于填充游标中的数据。我有两个选项来获取项目动画:

  1. 使用setHasStableIds(true)并覆盖getItemId以返回数据库行的ID,然后在适配器中使用swapCursor函数将当前光标与新光标交换然后调用notifyDatasetChanged

  2. 与选项1类似,但不是简单地交换游标并调用notifyDatasetChanged,而是迭代旧游标和新游标,比较行以确定添加/删除/更改了哪些行并保持跟踪他们,然后致电notifyItemAddednotifyItemChanged等,以告知适配器具体更新内容

  3. 使用选项1,notifyDatasetChanged将重新绑定效率低下的所有可见项(以及其他一些东西),但是使用选项2,我必须遍历整个光标以确定哪些项已经存在添加/删除,如果光标相当大,这可能还需要一些时间。有没有人对哪个更好的解决方案有什么想法?为什么?

    编辑:

    为了让事情变得更有趣,我还有第三个选择:

    1. 与选项2类似,但不是迭代游标中的每个项目,而是迭代当前绑定的项目(通过检查RecyclerView的孩子来计算),因为其他项目将会启动新光标值被绑定时的值。唯一的问题是它不能用于添加/删除,因此围绕它的方法是在oldCursor.count() != newCursor.count()进行完整的迭代。如果计数相同,我可以setHasStableIds(false),然后即使某个位置的行与之前的行不同,onBindViewHolder也会处理它。
    2. 这样做的缺点是ID不稳定,这意味着RecyclerView必须在某些地方做一些额外的工作

1 个答案:

答案 0 :(得分:0)

选项2容易出错。我会选择选项1,保持简单。