1

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

4

1 回答 1

3

根据sortedList文档

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

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

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

  • 保留最后添加的项目。当你用已经存在的值更新一个公共列表时,你最终会得到重复的值,而 sortedList 使用回调的 areItemsTheSame 替换相同的项目。
  • 智能更新视图。添加新项目时,仅当内容的一个或多个元素发生更改时才会调用 onChange。
  • 更好的性能,如果要将多个项目添加到 SortedList,如果将项目添加到连续索引中,BatchedCallback 调用会将单个 onInserted(index, 1) 调用转换为一个 onInserted(index, N) 调用。此更改可以帮助 RecyclerView 更轻松地解决更改。

另一方面,根据diffUtil文档

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

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

结论:

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

在这两种情况下,请在使用前阅读文档,以免产生意外结果。

于 2021-01-20T23:27:50.693 回答