android - 回收者 View 中的 DiffUtils 与稳定 Id

标签 android optimization android-recyclerview

我读了很多关于 RecyclerView 优化的内容 已经有一段时间了,学到了很多新概念。目前还不清楚的一件事是我们是否可以在 RecyclerView 中同时使用稳定的 id 和 DiffUtils。这种方法有可能的优点/缺点吗?根据我所读到的内容,我认为单独使用 DiffUtils 将带来重用 viewHolder 和漂亮动画的所有可能的好处(如果我错了,请纠正我)。详细的比较会很有帮助。

最佳答案

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

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

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

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

这里有一篇关于 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

关于android - 回收者 View 中的 DiffUtils 与稳定 Id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54089162/

相关文章:

java - 接口(interface)字段在 Android Studio 中显示为空

android - 通过提供图像 uri 使用图库的直接裁剪功能

java - 尝试在空对象引用上调用虚拟方法 'android.view.View android.view.View.findViewById(int)'

c++ - isdigit() 总是通过检查

python - 使用部分匹配交叉进行遗传算法时处理重复项

sql - 优化查询以删除 "Using where; Using temporary; Using filesort"

java - 错误 :cannot find symbol class RecyclerView

android - 处理 ShareActionProvider onClick 事件

java - Android:在另一个 Activity (由该 RecyclerView 启动)调用 finish() 后,RecyclerView 项目的 onClick() 被无意激活

android - Android Kotlin Firebase实时数据库:RecyclerView显示为空