Android笔记(四):RecyclerView
RecyclerView是ListView的增强版。有了它之后,你就可以抛弃ListView了。
recycle,重复利用。在ListView里,我们得自己写重复利用View的代码,而RecyclerView则是将此内置进去,并提供清晰的结构。
设计模式相关
RecyclerView 和 ListView 都是使用对象适配器模式。我专门为此写了一篇对适配器模式的介绍:设计模式:适配器模式
以下是该模式的UML类图(方便起见,为箭头加了说明):

对应到 RecyclerView :
| 类图 | RecyclerView |
|---|---|
| Client | android.support.v7.widget.RecyclerView |
| Target | android.support.v7.widget.RecyclerView.Adapter<VH extends android.support.v7.widget.RecyclerView.ViewHolder> |
| Adapter | 自己继承RecyclerView.Adapter并实现 |
| Adaptee | 需要展示的List数据 |
这里RecyclerView的Target没有再提出接口,直接写成抽象类
远程依赖库
如果使用RecyclerView,则需要在build.gradle的dependencies里添加远程依赖库:
compile 'com.android.support:recyclerview-v7:25.1.0'
这是为了让低版本的Android系统可以用到这个RecyclerView。如果不这样,则低版本无法使用。
RecyclerView 和 ListView 有什么不同?
- 继承结构不同:

- 它自带ViewHolder。我们再也不必自己添加各种判断了。
- 行布局文件不再由外部传入,而是在内部的onCreateViewHolder()里直接使用。
- 添加了横向的支持,即左右滚动。这个可以用在Android TV上。
- ……
RecyclerView的Adapter(以下称为RecyclerViewAdapter)内部需要重写的几个部分:
通过构造方法获得List
ListViewAdapter也是通过构造方法获得List,但还有另外两个参数,分别是Context和行布局的resourceId。
通过onCreateViewHolder()加载布局
ListViewAdapter在getView()里加载。
通过创建内部类并继承RecyclerView.ViewHolder来获取布局里的控件
ListViewAdapter也是创建内部类,但它是把findViewById()放到getView()里。RecyclerViewAdapter则是放在这个内部类里面。
通过onBindViewHolder()给控件赋值
Bind即绑定,意思是把数据绑定到ViewHolder上。
ListViewAdapter把这个动作放在getView()里。
从这几个部分可以看到,本来getView()里做的三个动作,现在分到三个不同的地方。
如下图,左边是ListView的Adapter,右边是RecyclerView的Adapter:

除此之外,RecyclerView需要在初始化它的地方给它传入LayoutManager。
如下图,左边是ListView的Activity,右边是RecyclerView的Activity:

ListView 自带三种Adapter的实现。例如很常用的ArrayAdapter,而RecyclerView则没有这样的实现,必须自己写Adapter并重写上面所说的各个方法。
虽然RecyclerView的Adapter没有ListView的三种方便的实现,但它有三个子类:
- ItemBridgeAdapter
- LeanbackListPreferenceDialogFragment.AdapterMulti
- LeanbackListPreferenceDialogFragment.AdapterSingle
这三个是给媒体设备(电视)或者游戏用的。所以如果你想要ArrayAdapter<T>;SimpleAdapter;SimpleCursorAdapter的效果,你得通过继承RecyclerView.Adapter来自己实现。
这里有个RecyclerView对SimpleCursorAdapter的实现:CursorRecyclerAdapter.java
效果
左边是ListView,右边是RecyclerView:

RecyclerView默认没有分割线。
如果想要分割线,可以使用默认的DividerItemDecoration:
DividerItemDecoration divider =
new DividerItemDecoration(recyclerView.getContext(),
layoutManager.getOrientation());
recyclerView.addItemDecoration(divider);
也可以通过继承RecyclerView.ItemDecoration来自定义。
点击事件
由于每一个Item里面可能有多个视图,如果想直接点击这些视图,在ListView里实现比较麻烦。
与ListView的setOnItemClickListener()不同,RecyclerView需要在其Adapter的onCreateViewHolder()里设置点击事件。

Android笔记(四):RecyclerView的更多相关文章
- Android Studio 学习笔记(四):Adapter和RecyclerView说明
在现版本中,滚动控件有多种,而相比于ListView,GridView,RecyclerView的用途更广,因此将前两者作为Adapter适配器的引入,再对RecyclerView进行简单讲解. MV ...
- Android学习笔记四十Preference使用
Preference直译为偏好,博友建议翻译为首选项.一些配置数据,一些我们上次点击选择的内容,我们希望在下次应用调起的时候依旧有效,无须用户再一次进行配置或选择.Android提供preferenc ...
- Android笔记——Android中数据的存储方式(二)
我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效 ...
- Android笔记:触摸事件的分析与总结----TouchEvent处理机制
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://glblong.blog.51cto.com/3058613/1559320 ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- Android笔记--View绘制流程源码分析(一)
Android笔记--View绘制流程源码分析 View绘制之前框架流程分析 View绘制的分析始终是离不开Activity及其内部的Window的.在Activity的源码启动流程中,一并包含 着A ...
- Android笔记--自定义控件仿遥控器的圆形上下左右OK圆盘按钮
原文:Android笔记--自定义控件仿遥控器的圆形上下左右OK圆盘按钮 上面就是几张预览图!代码在最底下 主要就两个步骤,画图.监听点击 1.整个控件基本上是一步步画出来的,重写onDraw方法开始 ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- Android 高级编程 RecyclerView 控件的使用
RecyclerView 是Android 新添加的一个用来取代ListView的控件,它的灵活性与可替代性比listview更好. 看一下继承关系: ava.lang.Object ↳ and ...
- 《MFC游戏开发》笔记四 键盘响应和鼠标响应:让人物动起来
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9327377 作者:七十一雾央 新浪微博:http:// ...
随机推荐
- 14-jQuery补充
jquery内容补充 jquery除了咱们上面讲解的常用知识点之外,还有jquery 插件.jqueryUI知识点 jqueryUI 官网: https://jqueryui.com/ jqueryU ...
- OneNET麒麟座应用开发之二:串口读取PM25传感器数据
作为环境数据监测站首先要获取大气中可吸入颗粒物的数据.为了检测PM25数据,我们采用北京海联信为的HLPM025K3型号传感器,该传感器使用激光法测量PM25和PM10的数据. 该型传感器的检测对象如 ...
- 无法下载apk等格式的文件的解决方案---ASP .NET Core 2.0 MVC 发布到IIS上以后无法下载apk等格式的文件的解决方案
ASP .NET Core MVC 发布到 IIS 上以后 无法下载apk等格式的文件 使用.NET Core MVC创建了一个站点,其他文件可以下载,但是后来又需求,就把手机端的apk合适的文件上 ...
- LeetCode(46):全排列
Medium! 题目描述: 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [ ...
- Entity Framework解决sql 条件拼接,完美解决 解决 不支持 LINQ 表达式节点类型“Invoke”【转】
传统的操作数据库方式,筛选数据需要用StringBuilder拼接一大堆的WHERE子句. 在Entity Framework中,代码稍有不慎就会造成巨大性能消耗,如: using(var db=ne ...
- java.lang.RuntimeException: Unable to get provider cn.jpush.android.service.DataProvider
转自:https://blog.csdn.net/u014306335/article/details/80355169 Android Studio 3.1.2 报错: java.lang.Runt ...
- 【AtCoder】AGC018
A - Getting Difference 我们肯定可以得到这些数的gcd,然后判断每个数减整数倍的gcd能否得到K #include <bits/stdc++.h> #define f ...
- 三步解决阿里云绑定公网IP地址失败解决方案
1.客户端设置为阿里云服务器的公有地址: 2.服务端设置为阿里云服务器的私有地址: 3.设置阿里云的管理规则: 第一步 第二步 第三.四步
- Redis简单了解
Redis介绍 Redis(REmote DIctionary Server)是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库, ...
- POJ1456 Supermarket 并查集
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ1456 题意概括 一家超市,要卖出N种物品(每种物品各一个),每种物品都有一个卖出截止日期Di(在该 ...