RecyclerView 是Android5.0的v7支持包中新增的一个 Widgets,它提供了一个耦合度更低的方式来复用ViewHolder,并可以轻松的实现ListView、GridView以及瀑布流的效果。
本博客源自于RecyclerView体验简介
RecyclerView和ListView的主要区别
1.强制使用ViewHolder
在ListView的性能优化方面,Android建议使用ViewHolder来减少findViewById()的次数,以提高效率。
而在RecyclerView中ViewHolder就变成了必须使用的模式,Adapter要求返回的也从普通的View变成了ViewHolder。
2.没有OnItemClickListener
ListView从他的父类AdapterView直接继承了对子项目的点击响应,开发者可以自己定义OnItemClickListener来接受点击事件。但是如果子项目内部视图如果设置了OnClickListener,那么子项目本身不回知道,从而会导致视图点击状态没有同步。
RecyclerView没有提供响应子项目被点击的监听器,但是RecyclerView可以通过RecyclerView.OnItemTouchListener接口来探测触摸事件,该接口只是帮助开发者截获触摸事件,它虽然增加了实现的难度,但是却给予开发人员拦截触摸事件更多的控制权限。
3.视图与布局分离
ListView做到了数据和视图的分离,RecyclerView在视图和布局之间再进一步分离,于是便有了LayoutManager。RecyclerView负责管理视图的重复利用,然后将布局方式全权交给了LayoutManager,通过配置或者切换LayoutManager就可以获得不同的布局效果。不像ListView被限制住在垂直滚动布局。LinearLayoutManager、GridLayoutManager和StaggeredGridLayoutManager。前者可以获得和ListView一样的布局,还可以是水平方向的;后者则提供了形如GridView的布局。同时RecyclerView还提供了ItemDecoration,在已有的子视图基础上还可以添加额外视图。
4.支持子项目层次的动画效果
ListView支持子项目层次的动画效果,不过实现方式比较冗长。
RecyclerView带来了ItemAnimator接口,当Adapter中的数据发生“增删改移”变化,通过调用Adapter相应的方法就可以激活动画的产生。当然开发者还需要自己实现具体的ItemAnimator对象来完成所需的动画效果,但是其结构和接口都较ListView清晰很多。
关于ItemAnimator的使用,有几点值得提醒的是:如果没有提供ItemAnimator,RecyclerView默认会创建一个DefaultItemAnimator用于动画,所以不需要显示地设置DefaultItemAnimator对象到RecyclerView上;添加(add)和删除(remove)是默认起效的,但是修改(change)的效果需要调用setSupportsChangeAnimations(boolean)来指定是否启用,其默认是没有修改的动画。
5.RecyclerView.Adapter
RecyclerView只提供了一个抽象的Adapter类,并没有提供可以直接使用的子类。而ListAdapter是有一些ArrayAdapter、SimpleCorsorAdapter的现成类。
RecyclerView.Adapter相对ListAdapter在接口上有几处变化:
首先其将getView()方法分拆成了createViewHolder()和bindViewHolder(),一个处理布局,一个处理数据。
最关键的注意点在于createViewHolder(ViewGroup parent, int viewType)第二参数虽然是整形,但是它并不是以往的当前子项的位置(position),而是调用getItemViewType()获得的的子项的类别。RecyclerView的Adapter除了和ListAdapter一样有notifyDataSetChanged()方法外,还有一堆会触发动画效果的通知数据改变的方法:
final void notifyItemChanged(int position);
final void notifyItemInserted(int position);
final void notifyItemMoved(int fromPosition, int toPosition);
final void notifyItemRangeChanged(int positionStart, int itemCount);
final void notifyItemRangeInserted(int positionStart, int itemCount);
final void notifyItemRangeRemoved(int positionStart, int itemCount);
final void notifyItemRemoved(int position);
调用这些方法就会激发ItemAnimator上对应的用于产生动画的方法。
RecyclerView的优缺点
优点
由于RecyclerView它只负责回收和重用的工作。所以关于布局、绘制和其他相关的问题,也就是跟数据展示相关的所有问题,都由一些“插件化”的类来处理。这使得RecyclerView的API变得非常灵活。当你需要一个新布局的时候,接入另一个LayoutManager就可以了;当你想要不同的动画的时候,接入一个新的ItemAnimator就可以了,诸如此类等等。
缺点
虽然在RecyclerView中,没有onItemClickListener方法。RecyclerView需要通过RecyclerView.OnItemTouchListener接口来探测触摸事件,对于如何处理,检测被触摸的目标对象都留给了开发者去完成。
为RecyclerView添加HeaderView和FooterView
需要为RecyclerView添加HeaderView和FooterView的童鞋,请查看鸿神的这篇blog Android 优雅的为RecyclerView添加HeaderView和FooterView