DiffUtil 和 SortedList 哪个更有效?

问题描述

我最近遇到了使用 DiffutilSortedList.Callback 来更改数据的概念,而不是直接使用 notifyDataSetChanged() 但是现在我很困惑在哪种情况下使用哪个。

解决方法

根据 sortedListdocumentation

排序列表实现,可以保持项目有序并通知列表中的更改,以便它可以绑定到 RecyclerView.Adapter。

它使用 SortedList.Callback.compare(Object,Object) 方法对项目进行排序,并使用二分搜索来检索项目。如果您的项目的排序标准可能发生变化,请确保在编辑它们时调用适当的方法以避免数据不一致。您可以通过 SortedList.Callback 参数控制项目的顺序和更改通知。

因此,sortedList 是 List 的不同实现,具有更多功能和能力。例如:

  • 保留上次添加的项目。当你用已经存在的值更新一个公共列表时,你最终会得到重复的值,而 sortedList 使用回调的 areItemsTheSame 替换相同的项目。
  • 巧妙地更新视图。添加新项目时,只有在内容的一个或多个元素发生更改时才会调用 onChange。
  • 更好的性能,如果您要将多个项目添加到 SortedList,如果项目被添加到连续的指数。此更改可以帮助 RecyclerView 更轻松地解决更改。

另一方面,根据 diffUtildocumentation

DiffUtil 是一个实用程序类,用于计算两个列表之间的差异并输出将第一个列表转换为第二个列表的更新操作列表。 它可用于计算 RecyclerView Adapter 的更新。

因此,diffUtil 是一个很棒的工具,它使您能够比较两个列表并找出它们之间的差异。然后您可以使用这些比较结果来做您想做的任何事情,但它并没有做更多的事情。在上面的链接中,您可以找到更多关于幕后发生的事情及其性能的信息。

结论:

  • sortedList 是一个具有更多功能的列表,为您提供比普通列表更多的功能。但是,在某些情况下,与普通 List 的行为也不同。
  • diffUtil 是一个很好的列表内容比较工具。但是,根据情况,它可能无法提供最佳性能。此外,它需要在后台线程中使用,并且它所比较的​​列表的内容在比较过程中不应发生变化。

两者中,使用前请阅读文档,以免出现意外结果。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...