【Android】你可能不知道的Support(一) 0步自动定向刷新:SortedList

本篇文章已授权微信公众号 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的一个理由吧。具体异同,稍后总结。先看怎么用吧。

Demo效果图,据说没图的文章没人看

用法:

我们来看看如果使用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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值