用Recyclerview实现列表分组、下拉刷新以及上拉加载更多
2016-07-13 14:23
961 查看
为什么要使用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:
![](http://upload-images.jianshu.io/upload_images/1131038-bdff40563015267d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
然后,覆写RecyclerView.Adapter的getItemViewType方法:
![](http://upload-images.jianshu.io/upload_images/1131038-f6033bcae0b8e94d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这一步是关键,看代码也能看出来,这个方法要做的事情很简单,就是区分Item的type类型,这里定义了两个类型的Type,TYPE_FOOTER和TYPE_ITEM,这个type会在后面用到:
![](http://upload-images.jianshu.io/upload_images/1131038-b3fd0134907e5c0f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
下一步是指定列表的count,大家都很熟悉了,在listview中的adapter里也有这样一个方法叫getCount(),RecyclerView.Adapter里叫getItemCount(),其实是一个意思。一般这个方法返回的都是数据源的条数mDataList.size(),但是,这里我给列表加了一个Footer,又不影响原始数据,那么就需要在count的基础上+1,然后在getItemViewType的时候,根据position是否为最后一条数据,来区分不同的ViewType。
接下来就是初始化Item布局的操作了,也是重写父类的方法onCreateViewHolder():
![](http://upload-images.jianshu.io/upload_images/1131038-e3d3b3f94132745b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这里的参数viewType就是我们在getItemViewType里面返回的type。
最后就是绑定数据了,相关方法onBindViewHolder():
![](http://upload-images.jianshu.io/upload_images/1131038-9098009f5388573e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这样一来,基本上就可以实现加载更多的功能了,但是,还要提供给Activity或者其他组件一个方法来更新UI,比如,什么时候显示”正在加载…”,什么时候显示“加载完成”,什么时候显示“没有更多数据”等状态,这里需要提供一个方法供外部调用:
![](http://upload-images.jianshu.io/upload_images/1131038-9f4d6b1a6f577276.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
分组的实现
说了半天,说好的分组呢???其实实现了FooterView,再实现分组基本上就没啥大问题了,同样的原理,把分组的组名也定义一个ViewHolder,对应一个ViewType:
![](http://upload-images.jianshu.io/upload_images/1131038-1dbb9ad6781ab175.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
getItemViewType也同样根据数据源中的标志或者其他信息,返回不同的type,这里需要根据服务器返回的数据具体操作,如果服务器返回的数据不足以完成分组的话,那么需要自己对数据进行封装,这需要在setList(List list)方法里完成,也就是设置数据源的时候,这个过程一定要注意getItemCount返回的值,否则肯定会报错。最后的效果如下:
![](http://upload-images.jianshu.io/upload_images/1131038-3da86e1ec9f96f74.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/1131038-461f160443e806a7.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/1240)
相关文章推荐
- 完美实现Android ListView中的TextView的跑马灯效果
- Android布局的小窍门?
- Web布局连载——两栏固定布局(五)
- android上改变listView的选中颜色
- Delphi7中Listview的常用功能汇总
- Delphi控件ListView的属性及使用方法详解
- 样式表CSS布局经验
- 在winform下实现左右布局多窗口界面的方法之续篇
- css网页布局中注意的几个问题小结
- DL.DT.DD实现左右的布局简单例子第1/2页
- 使用CSS框架布局的缺点和优点小结
- div+CSS网页布局的意义与副作用原因小结第1/2页
- 在winform下实现左右布局多窗口界面的方法
- Android ListView弹性效果的实现方法
- Android编程UI设计之GridView和ImageView的用法
- android中ListView数据刷新时的同步方法
- Android布局技巧之创建可重用的UI组件
- Android提高之ListView实现自适应表格的方法
- Android编程之代码创建布局实例分析
- Android中实现水平滑动(横向滑动)ListView示例