在解决列表显示,使用ListView或者CardView时,程序员自定义ViewHolder来缓存item,减少findViewById的调用,提高效率。这种方案已经基本成为了一种定式。Google在v7的包中推出了新的列表显示方案来代替ListView,这就是RecyclerView。
RecyclerView给我们提供了一个高自由度、高解耦的显示方案。不仅内置了ViewHolder,还集List、Card、以及瀑布流于一身。
RecyclerView提供了以下5个类供我们使用:
类名 | 使用说明 |
---|---|
RecyclerView.Adapter | 数据适配器,为每一项Item创建视图并且绑定数据 |
RecyclerView.ViewHolder | 承载Item视图的子布局,并进行缓存 |
RecyclerView.LayoutManager | 负责Item视图的布局的显示管理 |
RecyclerView.ItemDecoration | 给每一项Item视图添加子View,例如可以进行画分隔线之类 |
RecyclerView.ItemAnimator | 负责处理数据添加或者删除时候的动画效果 |
添加依赖项
使用v7包中的RecyclerView,首先在gradle中添加相应的包依赖项。
1 | compile 'com.android.support:recyclerview-v7:23.3.0' |
创建布局
首先要做的当然是给我们需要使用的控件一个合适的布局文件。与ListView一样,我们的布局文件包括两个,一个是RecyclerView本身,另外一个便是List中的item项。
1 | <!-- activity_main.xml --> |
1 | <!-- list_item.xml --> |
自定义适配器
适配器继承于RecyclerView.Adapter,必须要重写的是以下三个函数:
- onCreateViewHolder(),绑定item的布局文件
- onBindViewHolder(),将数据与item关联
- getItemCount(),返回需要显示的item个数
1 | /* MyAdapter.java */ |
添加使用RecyclerView
最后一步便是在Activity中初始化并使用。对于RecyclerView不仅需要绑定数据适配器,还要为其绑定一个LayoutManager。这里为了显示列表,使用了最简单的LinearLayoutManager。除此之外还有用于实现网格视图的GridLayoutManager,以及用于实现瀑布流的StaggeredGridLayoutManager。
1 | /* MainActivity.java */ |
完成以上步骤,最最简单的RecyclerView就能够运行了。
设置分隔线
虽然RecyclerView给了我们高度的定制自由,但也给我带来了一些工作量。比如没有默认的分隔线,没有默认的点击消息响应。
这里借鉴使用了github上的一个Divider实现类。alexfu/DividerItemDecoration.java
该类的实现是读取系统theme中的android.R.attr.listDivider
作为Item间的分隔线。因此我们如果想要自己定制的话,可以新建自己的theme,并自定义一个Drawable作为分隔线。
1 | <!-- divider.xml --> |
1 | <!-- my_theme.xml --> |
下阶段任务
[ ] 瀑布流实现
[ ] RecyclerView的单击响应
引用和链接
- 本文源码:https://github.com/onlytjt/MarkdownSource/tree/master/example/TestAppBarLayout
- https://github.com/baoyongzhang/RecyclerViewDemo/wiki/Introduce
- http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1118/2004.html
By tjt
2016.04.15