用Recyclerview实现列表分组、下拉刷新以及上拉加载更多

–为什么要使用Recyclerview替代ListView等?

       目前的项目中已经逐步抛弃了ListView、GridView以及各种自定义的瀑布流效果的第三方库了,统一用强大的替代者Recyclerview来实现。一个Recyclerview就解决了上面三种形式的布局展示方式,而且不用修改多少代码就能实现,或许这就是Recyclerview被大家接受和使用的原因之一吧!当然,另一个重要的原因肯定是性能上的优化喽!

       经历了从使用ListView到Recyclerview的转变,其实是可以感觉到性能的提升的,具体的性能提升在哪?怎么提升的?这里不做探讨和分析,本人也还没有做过这方面的系统总结。所以,本文主要说说如何用Recyclerview来实现列表分组、下拉刷新、上拉加载更多这样一个功能。

下拉刷新的实现

       下拉刷新的实现其实很简单了,用SwipeRefreshLayout就行,当然,如果公司产品对下拉刷新有特别的UI设计,那就另当别论。

上拉加载更多的实现

       这种效果在Listview中就很方便的实现了,直接调用Listview的公有方法addFooterView(View view),并根据Listview的滚动状态来刷新FooterView中的内容。但是切换到Recyclerview后发现找不到这个方法了!!!呵呵,可是并没有人告诉你Recyclerview有这个方法啊,(*^__^*) ,那有没有替代的方法提供呢?答案是:也没有!但是不要担心,既然系统没有提供现成的方法,那肯定就支持自己开发了,方法总是比困难多的。

下面就来说说上拉加载的实现。

首先,上拉加载的事情要在Adapter中来完成,定义一个ViewHolder,继承自RecyclerView.ViewHolder:

《用Recyclerview实现列表分组、下拉刷新以及上拉加载更多》 FooterViewHolder.png

然后,覆写RecyclerView.Adapter的getItemViewType方法:

《用Recyclerview实现列表分组、下拉刷新以及上拉加载更多》 getItemViewType.png

这一步是关键,看代码也能看出来,这个方法要做的事情很简单,就是区分Item的type类型,这里定义了两个类型的Type,TYPE_FOOTER和TYPE_ITEM,这个type会在后面用到:

《用Recyclerview实现列表分组、下拉刷新以及上拉加载更多》 constants.png

下一步是指定列表的count,大家都很熟悉了,在listview中的adapter里也有这样一个方法叫getCount(),RecyclerView.Adapter里叫getItemCount(),其实是一个意思。一般这个方法返回的都是数据源的条数mDataList.size(),但是,这里我给列表加了一个Footer,又不影响原始数据,那么就需要在count的基础上+1,然后在getItemViewType的时候,根据position是否为最后一条数据,来区分不同的ViewType。

接下来就是初始化Item布局的操作了,也是重写父类的方法onCreateViewHolder():

《用Recyclerview实现列表分组、下拉刷新以及上拉加载更多》 onCreateViewHolder.png

这里的参数viewType就是我们在getItemViewType里面返回的type。

最后就是绑定数据了,相关方法onBindViewHolder():

《用Recyclerview实现列表分组、下拉刷新以及上拉加载更多》 onBindViewHolder.png

这样一来,基本上就可以实现加载更多的功能了,但是,还要提供给Activity或者其他组件一个方法来更新UI,比如,什么时候显示”正在加载…”,什么时候显示“加载完成”,什么时候显示“没有更多数据”等状态,这里需要提供一个方法供外部调用:

《用Recyclerview实现列表分组、下拉刷新以及上拉加载更多》 setLoadingStatus.png

分组的实现

说了半天,说好的分组呢???其实实现了FooterView,再实现分组基本上就没啥大问题了,同样的原理,把分组的组名也定义一个ViewHolder,对应一个ViewType:

《用Recyclerview实现列表分组、下拉刷新以及上拉加载更多》 TItleViewHolder.png

getItemViewType也同样根据数据源中的标志或者其他信息,返回不同的type,这里需要根据服务器返回的数据具体操作,如果服务器返回的数据不足以完成分组的话,那么需要自己对数据进行封装,这需要在setList(List<Object> list)方法里完成,也就是设置数据源的时候,这个过程一定要注意getItemCount返回的值,否则肯定会报错。最后的效果如下:

《用Recyclerview实现列表分组、下拉刷新以及上拉加载更多》 分组实现
《用Recyclerview实现列表分组、下拉刷新以及上拉加载更多》 底部加载更多

2016年8月19日更新

这里放上Recyclerview的适配器源码:

http://blog.csdn.net/Violet_yang/article/details/52248599

    原文作者:星际之痕
    原文地址: https://www.jianshu.com/p/be62ce21ea57
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞