初识RecyclerView
RecyclerView是官方推出的可以灵活展示大量数据的View控件,比ListView更加灵活也更强大。
术语
RecycleView中有些属性值得我们注意。
- Adapter,继承自RecyclerView.Adapter的一系列适配器,负责提供view用于展示数据集。
- Position,数据item在适配器中所处的位置。
- Index,调用getChildAt(int)时使用的子视图的索引,和Position相对应。
- Binding,准备子视图显示适配器内对应位置数据的过程。
- Recycle(View),先前用于显示特定位置的适配器数据的子视图可以被放置在高速缓存中,以备后续重用现实相同类型的数据。这样避免了再次初始化布局,可以大幅提高效率。
- Scrap(View),子视图暂时进入和布局脱离的状态。子视图可能会被重新利用,因此不会和RecycleView完全脱离,再次绑定的时候如果数据是脏的需要由适配器重新绑定数据。
- Dirty(View),必须由Adapter重新绑定才能显示的子视图。
Position In RecyclerView
包括layout position和Adapter Position,除了调用Adapter.notify*事件计算更新的布局之外,这两个位置信息是一样的。
Layout position,表示最新布局下的位置信息,可调用getLayoutPosition()获取,获取到位置之后可以调用findViewHolderForLayoutPosition(int)方法获取对应位置的ViewHolder。
Adapter position,表示适配器中元素的位置信息,同样有getAdapterPosition()方法 和findViewHolderForAdapterPosition()。需要注意的是,在程序调用notifyDataChanged()方法后,但是新的布局 还未被计算出来时,getAdapterPosition()不能返回正确的值,我们应当对NoPosition 或者null等返回值做相应的处理。
When writing a RecyclerView.LayoutManager
you almost always want to use layout positions whereas when writing an RecyclerView.Adapter
, you probably want to use adapter positions.
RecyclerView的使用
RecyclerView的使用和ListView的使用有很多相似之处,只不过实现方式更加了灵活需要自行设置的属性更多。RecyclerView必须设置如下属性:
- LayoutManager,通过mRecyclerView.setLayoutManager()方法设置
- ItemAnimator,调用mRecyclerView.setItemAnimator()方法设置
- Adapter,调用mRecyclerView.setAdapter()
- ItemDecoration,分割线,通过mRecyclerView.addItemDecoration()方法设置分割线
先简单讲述LayoutManager,这个属性控制可dataSet在View中的展示方式,官方提供了三中默认的实现:LinearLayoutManager、GridLayoutManager和StaggeredGridLayoutManager。通过设置不同的LayoutManager可以实现各种样式的布局。
ItemAnimator,可以配置item的增加和删除动画,系统提供了默认的实现,我们也可以通过编写代码实现各种酷炫的动画效果。github上面有很多第三方的动画,使用十分方便。需要注意的是,只有使用notifyItemInsert()和notifyItemRemove()方法进行数据更新才会有动画效果,直接使用notifyDataSetChanged()方法是没有动画效果的。
Adapter,实现了布局和dataSet之间的绑定。相信使用过ListView后对适配器一定不会陌生。
ItemDecoration,通过mRecyclerView.addItemDecoration()方法添加分割线,我们可以继承抽象类RecyclerView.ItemDecoration来实现自己的分割线。这个官方只是提供了抽象类,并没有提供任何默认的实现。
RecyclerView的优势
RecyclerView的官方介绍:A flexible view for providing a limited window into a large data set.
简单的说明了RecyclerView的最大优点——灵活。
通过上面的介绍我们也发现,RecyclerView的布局、数据绑定、动画和分割线都可以自行定义。