美文网首页安卓开发菜菜AndroidrecyclerView
用Recyclerview实现列表分组、下拉刷新以及上拉加载更多

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

作者: 星际之痕 | 来源:发表于2016-06-28 18:31 被阅读11199次

--为什么要使用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:

FooterViewHolder.png

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

getItemViewType.png

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

constants.png

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

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

onCreateViewHolder.png

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

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

onBindViewHolder.png

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

setLoadingStatus.png

分组的实现

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

TItleViewHolder.png

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

分组实现 底部加载更多

2016年8月19日更新

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

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

相关文章

网友评论

  • 黄宏发:能提供完整的demo就可以了
  • ab7f57894826:楼主有demo吗?能给我发qq里吗,353490974
    星际之痕:@记忆海_b761 适配器源码在文章下面链接里
  • Greathfs:楼主 问下 CircularImageView 用那个哪个开源控件呢?
    星际之痕:@Greathfs 你说的是这种组合效果吗?是仿QQ讨论组头像,自定义的,自己画的圆形头像!
    Greathfs:@星际之痕 我百度了啊。。。我还去github上看了 都是显示一个图片的啊:sweat:
    星际之痕:@Greathfs 百度一下,你就知道!
  • dbde38e0941f:楼主,您好!我想问,上拉加载,实现了底部footer,您是如何监测滑动到底部然后要去更新了 的事件呢?
  • 冰冰的冻结:来个demo 参考一下吧
    星际之痕:@冰冰的冻结 http://blog.csdn.net/Violet_yang/article/details/52248599
    星际之痕:@冰冰的冻结 好吧,明天整理出来发一下
  • 咚咚淌淌:楼主可以发个源码吗,参考参考
    咚咚淌淌: @星际之痕 好吧,得抽个时间好好研究怎么处理方便😊
    星际之痕:@咚咚淌淌 http://blog.csdn.net/Violet_yang/article/details/52248599
    星际之痕:@咚咚淌淌 :scream:这个是项目中抽取的,没有准备单独的项目源码!

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

本文链接:https://www.haomeiwen.com/subject/wsstjttx.html