本篇文章已授权微信公众号 hongyangAndroid (鸿洋)独家发布
转载请标明出处:
http://blog.csdn.net/zxt0601/article/details/53495709
本文出自:【张旭童的博客】(http://blog.csdn.net/zxt0601)
代码传送门:喜欢的话,随手点个star。多谢
https://github.com/mcxtzhang/SupportDemos
背景:
打算写一个系列了,讲解Android Support包内那些常用or冷门有用的工具类的合集。
最近leader在优化IM会话列表,同事以前的做法是无脑notifyDatasetChanged()刷新RecyclerView的。
在消息聊得很嗨很多的时候,界面频繁刷新,会话列表会出现丢失焦点现象。且性能毕竟不高。
遂想采用定向刷新。
同事知道我以前研究过DiffUtil和定向刷新相关内容,于是便和我讨论。
(不知道DiffUtil的点这里)http://blog.csdn.net/zxt0601/article/details/52562770
(不了解定向刷新的点这里)http://blog.csdn.net/zxt0601/article/details/52703280
由于IM会话列表是从数据库里读的,他还告诉我会有数据集重复的现象,且会话列表肯定是按时间排序的,所以这对我们的数据组织提出了两点要求:有序、去重。
我的想法是:
* 采用DiffUtil自动计算新老数据集差异,然后自动完成定向刷新。
* 至于数据集的去重和有序,我打算用TreeSet去帮助我们做。
利用Set本身元素不重复的特性,加之Tree的有序性,来解决数据组织的两个需求。
可是leader不知道从哪搜出来一个SortedList,告诉我这是Android SDK提供的。也可以完成排序and去重。
我心说这是哪路神仙,我以为是JDK给的呢,于是也查阅了一番资料,遂揭开了SortedList的神秘面纱,也有了今天的文章。
转载请标明出处:
http://blog.csdn.net/zxt0601/article/details/53495709
本文出自:【张旭童的博客】(http://blog.csdn.net/zxt0601)
代码传送门:喜欢的话,随手点个star。多谢
https://github.com/mcxtzhang/SupportDemos
SortedList是什么?
源码头注释如下:
A Sorted list implementation that can keep items in order and also notify for changes in the list。
翻译:
一个有序列表(数据集)的实现,可以保持ItemData都是有序的,并(自动)通知列表(RecyclerView)(数据集)中的更改。
人话:
首先它是一种数据结构,是一个有序的List,list改变后(增删改查),也可以一直保持数据集List有序,并且会自动调用**adapter中定向更新**notifyXXXX方法,更新RecyclerView。
对了,它还会自动去重。
关键点:
搭配RecyclerView使用,去重,有序,自动定向刷新
刚看到这里,我觉得这特么自动定向刷新这一点特性,怎么有点像DiffUtil,后来我查阅资料才发现,这家伙出来的比DiffUtil要早,是在Support Library 22 引入的。所以说应该是DiffUtil像它。
而且SortedList 和 DiffUtil 内部 都实现、持有了一些共同的接口,暴漏出供我们重写比较规则的Callback的方法名都几乎一毛一样。
我个人感觉SortedList从设计上和DiffUtil比,是有一点点不足,这可能也是官方后来又在Support Library 24 中引入DiffUtil的一个理由吧。具体异同,稍后总结。先看怎么用吧。
用法:
我们来看看如果使用SortedList该怎么写:
Adapter:
要写RecyclerView,就少不了Adapter。
一个常规的Adapter内部一般持有一个List<T>
的数据集,
使用SortedList
的话,需要将存储数据源的变量类型改变成SortedList,
* 唯一差异:将以前的ArrayList->替换为SortedList.
其他的话,倒没有变化,因为SortedList虽然没有继承自List,但是暴漏出API还和List一样的。
public class SortedAdapter extends RecyclerView.Adapter<SortedAdapter.VH> {
/**
* 数据源替换为SortedList,
* 以前可能会用ArrayList。
*/
private SortedList<TestSortBean&g