RecyclerView | 在 RecyclerView 中使用 ListAdapter
添加元素的动画效果
处理差异比较
DiffUtil 是 ListAdapter 能够高效改变元素的奥秘所在。DiffUtil 会比较新旧列表中增加、移动、删除了哪些元素,然后输出更新操作的列表将原列表中的元素高效地转换为新的元素。
为了能够识别新的数据,DiffUtil 需要您重写 areItemsTheSame() 和 areContentsTheSame()。areItemsTheSame() 检查两个元素是否为同一元素。areContentsTheSame() 检查两个元素是否包含相同的数据。
areItemsTheSame() 比较元素的示意图
<!-- Copyright 2019 Google LLC.
SPDX-License-Identifier: Apache-2.0 -->
object FlowerDiffCallback : DiffUtil.ItemCallback<Flower>() {
override fun areItemsTheSame(oldItem: Flower, newItem: Flower): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: Flower, newItem: Flower): Boolean {
return oldItem == newItem
}
}
<!-- Copyright 2019 Google LLC.
SPDX-License-Identifier: Apache-2.0 -->
class FlowerAdapter : ListAdapter<String, FlowerAdapter.FlowerViewHolder>(FlowerDiffCallback)
更新列表
ListAdapter 通过 submitList() 方法获取数据,该方法提交了一个列表来与当前列表进行对比并显示。也就是说您无需再重写 getItemCount(),因为 ListAdapter 会负责管理列表。
ListAdapter
https://developer.android.google.cn/reference/androidx/recyclerview/widget/ListAdapter
submitList()
https://developer.android.google.cn/reference/androidx/recyclerview/widget/ListAdapter#submitList(java.util.List%3CT%3E)
在 Activity 类中,调用 Adapter 的 submitList() 方法并传入数据列表。
<!-- Copyright 2019 Google LLC.
SPDX-License-Identifier: Apache-2.0 -->
val flowerList = resources.getStringArray(R.array.flower_array).toMutableList()
val flowerAdapter = FlowerAdapter()
flowerAdapter.submitList(flowerList)
在 Adapter 类中,onBindViewHolder() 现在可以使用 getItem() 从数据列表中获取指定位置的元素了。
getItem() https://developer.android.google.cn/reference/androidx/recyclerview/widget/ListAdapter#getItem(int)
<!-- Copyright 2019 Google LLC.
SPDX-License-Identifier: Apache-2.0 -->
override fun onBindViewHolder(holder: FlowerViewHolder, position: Int) {
holder.bind(getItem(position))
}
就这么简单。仅需几步简单操作就可以在您的 RecyclerView 中使用 ListAdapter。现在您的应用可以通过使用 ListAdapter 来更新那些发生变化的元素以获得更好的性能和用户体验了。
下一步
关于 ListAdapter 的完整示例代码都在这里。
完整示例代码 https://github.com/android/views-widgets-samples/tree/main/RecyclerViewKotlin
感谢阅读 RecyclerView 系列的第二篇文章。请继续关注未来更多关于 RecyclerView 的内容。
官方文档
https://developer.android.google.cn/reference/androidx/recyclerview/widget/ListAdapter
推荐阅读