RecyclerView Tips(2) SortedListAdapter
Contents
上一篇说到Tabs+ViewPager+ListView是最常见的组合,这篇就议一议如何用RecyclerView
快速实现列表页面。
如一个简单的列表场景:TodoList。
分页加载现有Todo
现有数据基础上增、删、改
RecyclerView
的使用在此就不赘述了,本文主要讨论RecyclerView.Adapter
的实现
使用最简单的ArrayList
实现,如下:
1 | class ListAdapter extends RecyclerView.Adapter<TodoViewHolder> { |
这样的Adapter
一个显而易见的问题就是,如何做数据的去重。
- 添加一项数据:最简单的是在
addItem()
之前,遍历一次mData
,定位后再决定是插入还是更新现有数据,并调用notifyItemInserted(pos)
。 - 添加多个数据:多次重复上面的方法…
对于少量数据来说这样做并不见得有什么问题,而且写得多了,都有自己封装好的诸如ArrayObjectAdapter
之类方便使用。
这样就够了吗?
答案肯定是不。Android Support Library 悄悄给我们提供了一个叫SortedList
的工具类,它默默的藏在support库的角落中,鲜为人知。
SortedList?
文档对它的定义:
- 是一个有序列表
- 数据变动会触发回调
SortedList.Callback
的方法,如onChanged()
构造一个SortedList
需要实现它的回调SortedList.Callback
,并由其来定义数据的排序和数据的唯一性。
它有一个实现类SortedListAdapterCallback
就是RecyclerView.Adapter
与SortedList
交互的秘密武器。
示例
改造后的ListAdapter
:
1 | class SortedListAdapter extends RecyclerView.Adapter<TodoViewHolder> { |
虽然相对ListAdapter
代码量变多了,但是调用者却再也不用关心数据的去重与通知更新的问题。这一切都有SortedListAdapterCallback
帮你自动处理好了。
单单只这一个好处其实并不值得劳师动众去改掉现有Adapter使用SortedList
,但它另外还有一个令人称赞并喜爱的功能:批量更新(Batched Updates)。
就如实现添加多个数据:
1 | void addItems(List<Item> items){ |
批量删除:
1 | void deleteItems(List<Item> items){ |
等等。
如例子所示,调用beginBatchedUpdates()
之后,所有的对SortedList
操作都会等到endBatchedUpdates()
之后一起生效。
完整的示例见:官方Support库Samples ($ANDROID_SDK/extras/android/support/samples/Support7Demos)
More Tips
- 列表无序的情况,可以用其id或原始数据List的index来比较排序,只要确保能正确实现
compare
即可 - 如无需批量更新,或无频繁的增删改,其实用前面的
ListAdapter
比较好。
总之:如果你的列表需要批量更新或者频繁删改,且刚好有明确的先后顺序,快使用SortedList
。
Author: Yrom
Link: https://yrom.net/blog/2015/10/13/recyclerview-tips-2-sortedlist/
License: 知识共享署名-非商业性使用 4.0 国际许可协议