回收者视图中的 DiffUtils 与稳定 ID

Kas*_*tra 8 optimization android android-recyclerview

一段时间以来,我一直在阅读有关 RecyclerView 中优化的大量内容,并且学到了很多新概念。尚不清楚的一件事是我们能否在 RecyclerView 中同时使用稳定 ID 和 DiffUtils。这种方法有可能的好处/缺点吗?从我所读到的内容来看,我认为单独使用 DiffUtils 将带来重用 viewHolders 和漂亮动画的所有可能的好处(如果我错了,请纠正我)。详细的比较将非常有帮助。

小智 7

长话短说,DiffUtill 完全取代了 stableIds 方法。

当每个人都从 ListView 迁移到 RecyclerView 时,StableIds 是一种遗留方法。与 ItemAnimator 一起,它提供了一种简单的方法来获得开箱即用的简单预测动画。预测性意味着当您只调用 notifyDataSetChanges 时,RV 可以自行推断添加/删除或移动了哪些项目,而无需担心其他回调。

一旦 DiffUtil 出现,就不需要 RV 来推断,因为 DiffUtills 会准确地告诉 RV 哪些项目正在被移动/添加/删除。

我在非常恶劣的条件下使用 RV,有几十种项目类型,每秒更新多次数据,并花了十几个小时调试 RV 和动画内部,但没有注意到其报废/去报废/1-2-3 的任何重大变化尝试在 DiffUtil 之上添加 stableIds 时的 -steps-layouting 行为。

这是关于动画在大约 2015 年 DiffUtill 之前的工作原理的重要文章:

https://www.birbit.com/recyclerview-animations-part-1-how-animations-work/

https://www.birbit.com/recyclerview-animations-part-2-behind-the-scenes/

如果您对 RV 内部结构感兴趣,还有一点:

https://android.jlelse.eu/anatomy-of-recyclerview-part-1-a-search-for-a-viewholder-404ba3453714