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>SimpleAdapterSimpleCursorAdapter的效果,你得通过继承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的更多相关文章

  1. Android Studio 学习笔记(四):Adapter和RecyclerView说明

    在现版本中,滚动控件有多种,而相比于ListView,GridView,RecyclerView的用途更广,因此将前两者作为Adapter适配器的引入,再对RecyclerView进行简单讲解. MV ...

  2. Android学习笔记四十Preference使用

    Preference直译为偏好,博友建议翻译为首选项.一些配置数据,一些我们上次点击选择的内容,我们希望在下次应用调起的时候依旧有效,无须用户再一次进行配置或选择.Android提供preferenc ...

  3. Android笔记——Android中数据的存储方式(二)

    我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效 ...

  4. Android笔记:触摸事件的分析与总结----TouchEvent处理机制

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://glblong.blog.51cto.com/3058613/1559320   ...

  5. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  6. Android笔记--View绘制流程源码分析(一)

    Android笔记--View绘制流程源码分析 View绘制之前框架流程分析 View绘制的分析始终是离不开Activity及其内部的Window的.在Activity的源码启动流程中,一并包含 着A ...

  7. Android笔记--自定义控件仿遥控器的圆形上下左右OK圆盘按钮

    原文:Android笔记--自定义控件仿遥控器的圆形上下左右OK圆盘按钮 上面就是几张预览图!代码在最底下 主要就两个步骤,画图.监听点击 1.整个控件基本上是一步步画出来的,重写onDraw方法开始 ...

  8. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  9. Android 高级编程 RecyclerView 控件的使用

    RecyclerView 是Android 新添加的一个用来取代ListView的控件,它的灵活性与可替代性比listview更好. 看一下继承关系: ava.lang.Object    ↳ and ...

  10. 《MFC游戏开发》笔记四 键盘响应和鼠标响应:让人物动起来

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9327377 作者:七十一雾央 新浪微博:http:// ...

随机推荐

  1. android 手机拍照返回 Intent==null 以及intent.getData==null

    手机拍照第一种情况:private void takePicture(){ Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);Si ...

  2. Oracle ____Undo

    什么是回滚和撤销 update emp set sal=4000 where empno=7788 语句执行过程 1 检查empno=7788记录是否在buffer cache ,如果不存在,则读取到 ...

  3. Mac下brew安装与配置mysql

    一.打开mac控制台 $ brew install mysql 二.启动mysql服务 $ mysql.server start 三.初始化mysql配置 1 rainMacBook-Pro:~ co ...

  4. 搭建ssh框架项目(四)

    一.创建控制层 (1)创建VO值对象,对应页面表单的属性值 package com.cppdy.ssh.web.form; /** * VO值对象,对应页面表单的属性值 * VO对象与PO对象的关系: ...

  5. VIM 报错

    syntax error: unexpected end of file if 没配对 在最后加 fi 试试 环境变量用不了 export PATH=/usr/bin:/usr/sbin:/bin:/ ...

  6. python 全栈开发,Day45(html介绍和head标签,body标签中相关标签)

    一.html介绍 1.web标准 web准备介绍: w3c:万维网联盟组织,用来制定web标准的机构(组织) web标准:制作网页遵循的规范 web准备规范的分类:结构标准.表现标准.行为标准. 结构 ...

  7. locust的安装与使用

    Contents Locust这一款开源性能测试工具.然而,当前在网络上针对Locust的教程极少,不管是中文还是英文,基本都是介绍安装方法和简单的测试案例演示,但对于较复杂测试场景的案例演示却基本没 ...

  8. C#泛型(一)

    简介: 先看看泛型的概念--“通过参数化类型来实现在同一份代码上操作多种数据类型.利用“参数化类型”将类型抽象化,从而实现灵活的复用”. 很多初学者在刚开始接触泛型的时候会比较难理解 “泛型” 在这里 ...

  9. 观察者模式(Observer Pattern)

    一.概述在软件设计工作中会存在对象之间的依赖关系,当某一对象发生变化时,所有依赖它的对象都需要得到通知.如果设计的不好,很容易造成对象之间的耦合度太高,难以应对变化.使用观察者模式可以降低对象之间的依 ...

  10. spring配置redis注解缓存

    前几天在spring整合Redis的时候使用了手动的方式,也就是可以手动的向redis添加缓存与清除缓存,参考:http://www.cnblogs.com/qlqwjy/p/8562703.html ...