为了让RecyclerView可以在所有的Android版本中都能使用,Android开发团队将RecyclerView定义在support.v7包当中。在使用该控件时需要打开当前Modile的build.gradle文件,然后在dependencies节点中添加依赖库的代码。具体代码如下:

  1. compile 'com.android.support:recyclerview-v7:插入版本号'

添加完成以后需要单击右上角的Sync Now进行同步。同步完成后可以在布局文件中添加RecyclerView控件,语法格式如下:

  1. <android.support.v7.widget.RecyclerView
  2.  
  3. android:id="@+id/my_recycler_view"
  4.  
  5. android:scrollbars="vertical"
  6.  
  7. android:layout_width="match_parent"
  8.  
  9. android:layout_height="match_parent"/>

控制RecyclerView需要一些常用的方法,具体方法如下:

◆ setLayoutManager:设置列表项的布局管理器,LinearLayoutManager为线性布局管理器、GridLayoutManager为网格布局管理器、StaggeredGridLayoutManager为瀑布流网格布局管理器。

◆ setItemAnimator:设置列表项增加或者是删除时的动画,可以使用关键字new创建 DefaultItemAnimator()对象实现系统默认的动画效果。

◆ addItemDecoration:添加列表项分割线。

◆ addOnItemTouchListener:添加列表项的触摸监听器。

◆ removeOnItemTouchListener:移除列表项的触摸监听器。

◆ setAdapter:设置列表项的适配器,使用RecyclerView.Adapter。

RecyclerView.Adapter是为RecyclerView所单独设计的适配器类,RecyclerView.Adapter的相关方法如下:

◆ getItemCount:获取列表项的数目。

◆ onBindViewHolder:绑定列表项中所显示的数据。

◆ onCreateViewHolder:在该方法中可以加载列表item(子项)中的布局文件。

下面通过一个具体的实例演示RecyclerView垂直列表的具体应用。

实例 模拟QQ消息列表

在Android Studio中创建Module,名称为“QQMessageList”,具体步骤如下:

(1)打开build.gradle(Module: QQMessageList)文件,然后在该文件中的dependencies节点中添加依赖库的代码。

(2)修改新建Module的res/layout目录下的布局文件activity_main.xml,将默认添加的布局管理器修改为相对布局管理器并将TextView组件删除,然后添加1个RecyclerView组件用于显示消息列表。具体代码如下:

  1. 01 <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. 02 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  4.  
  5. 03 xmlns:app="http://schemas.android.com/apk/res-auto"
  6.  
  7. 04 xmlns:tools="http://schemas.android.com/tools"
  8.  
  9. 05 android:layout_width="match_parent"
  10.  
  11. 06 android:layout_height="match_parent"
  12.  
  13. 07 tools:context="com.mingrisoft.MainActivity">
  14.  
  15. 08 <!--列表控件-->
  16.  
  17. 09 <android.support.v7.widget.RecyclerView
  18.  
  19. 10 android:id="@+id/recyclerview"
  20.  
  21. 11 android:background="#EEEEEE"
  22.  
  23. 12 android:layout_width="match_parent"
  24.  
  25. 13 android:layout_height="wrap_content"
  26.  
  27. 14 android:orientation="vertical"
  28.  
  29. 15 />
  30.  
  31. 16 </RelativeLayout>

(3)在res/layout目录中创建1个名称为layout_item.xml的布局文件,将默认添加的布局管理器修改为相对布局管理器,首先添加1个ImageView组件用于显示头像的图标,然后添加1个垂直线性布局管理器,在该布局管理器中添加2个TextView组件分别用于显示名称与文字消息。具体代码如下:

  1. 01 <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. 02 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  4.  
  5. 03 android:layout_width="match_parent"
  6.  
  7. 04 android:layout_height="50dp"
  8.  
  9. 05 android:layout_marginBottom="1dp"
  10.  
  11. 06 android:background="@android:color/white"
  12.  
  13. 07 android:gravity="center_vertical">
  14.  
  15. 08 <!--图标-->
  16.  
  17. 09 <ImageView
  18.  
  19. 10 android:id="@+id/img"
  20.  
  21. 11 android:layout_width="50dp"
  22.  
  23. 12 android:layout_height="50dp"
  24.  
  25. 13 android:layout_alignParentLeft="true"
  26.  
  27. 14 android:layout_alignParentStart="true"
  28.  
  29. 15 android:layout_alignParentTop="true" />
  30.  
  31. 16 <LinearLayout
  32.  
  33. 17 android:layout_width="wrap_content"
  34.  
  35. 18 android:layout_height="match_parent"
  36.  
  37. 19 android:layout_toRightOf="@+id/img"
  38.  
  39. 20 android:gravity="center_vertical"
  40.  
  41. 21 android:orientation="vertical">
  42.  
  43. 22 <!--名称-->
  44.  
  45. 23 <TextView
  46.  
  47. 24 android:id="@+id/name"
  48.  
  49. 25 android:layout_width="match_parent"
  50.  
  51. 26 android:layout_height="wrap_content"
  52.  
  53. 27 android:layout_marginLeft="20dp"
  54.  
  55. 28 android:textColor="#000000"
  56.  
  57. 29 android:textSize="15dp" />
  58.  
  59. 30 <!--消息-->
  60.  
  61. 31 <TextView
  62.  
  63. 32 android:id="@+id/info"
  64.  
  65. 33 android:layout_width="match_parent"
  66.  
  67. 34 android:layout_height="wrap_content"
  68.  
  69. 35 android:layout_marginLeft="20dp"
  70.  
  71. 36 android:layout_marginRight="15dp"
  72.  
  73. 37 android:singleLine="true"
  74.  
  75. 38 android:textSize="10dp" />
  76.  
  77. 39 </LinearLayout>
  78.  
  79. 40 </RelativeLayout>

(4)在res/values目录中的strings.xml字符串资源文件内添加名字与文字消息,用于显示在列表当中。

(5)在com.mingrisoft包中创建1个名称为Adapter的Java类,首先在该类中创建1个名称为MyViewHolder的内部类并让该类继承自RecyclerView.ViewHolder,在该内部类中获取列表中用于显示名称、头像图标与文字信息的组件。然后让Adapter类继承自RecyclerView.Adapter<Adapter.MyViewHolder>并且实现相对应的方法。具体代码如下:

  1. 01 public class Adapter extends RecyclerView.Adapter<Adapter.MyViewHolder> {
  2.  
  3. 02 @Override
  4.  
  5. 03 public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  6.  
  7. 04 return null;
  8.  
  9. 05 }
  10.  
  11. 06 @Override
  12.  
  13. 07 public void onBindViewHolder(MyViewHolder holder, int position) {
  14.  
  15. 08 }
  16.  
  17. 09 @Override
  18.  
  19. 10 public int getItemCount() {
  20.  
  21. 11 return 0;
  22.  
  23. 12 }
  24.  
  25. 13 class MyViewHolder extends RecyclerView.ViewHolder {
  26.  
  27. 14 public TextView name, info; //编号文字
  28.  
  29. 15 public ImageView img; //图标
  30.  
  31. 16
  32.  
  33. 17 //获取相关控件
  34.  
  35. 18 public MyViewHolder(View itemView) {
  36.  
  37. 19 super(itemView);
  38.  
  39. 20 name = (TextView) itemView.findViewById(R.id.name);
  40.  
  41. 21 info = (TextView) itemView.findViewById(R.id.info);
  42.  
  43. 22 img = (ImageView) itemView.findViewById(R.id.img);
  44.  
  45. 23 }
  46.  
  47. 24 }
  48.  
  49. 25 }

(6)创建3个int类型的数组分别用于保存头像的图标资源、名字、文字信息,然后创建3个ArrayList集合分别用于保存数组中的资源文件,最后创建1个Adapter构造方法,在该方法中设置菜单行数与行内图标、名称与文字信息具体代码如下:

  1. 01 //图标数组
  2.  
  3. 02 private int[] icons = {
  4.  
  5. 03 R.mipmap.icon_1, R.mipmap.icon_2, R.mipmap.icon_3,
  6.  
  7. 04 R.mipmap.icon_4, R.mipmap.icon_5, R.mipmap.icon_6,
  8.  
  9. 05 R.mipmap.icon_7, R.mipmap.icon_8, R.mipmap.icon_9,
  10.  
  11. 06 R.mipmap.icon_10, R.mipmap.icon_11
  12.  
  13. 07 };
  14.  
  15. 08 //名字数组,引用资源文件中的文字
  16.  
  17. 09 private int[] names = {
  18.  
  19. 10 R.string.name1, R.string.name2, R.string.name3,
  20.  
  21. 11 R.string.name4, R.string.name5, R.string.name6,
  22.  
  23. 12 R.string.name7, R.string.name8, R.string.name9,
  24.  
  25. 13 R.string.name10, R.string.name11
  26.  
  27. 14 };
  28.  
  29. 15 //信息数组
  30.  
  31. 16 private int[] infos = {
  32.  
  33. 17 R.string.info1, R.string.info2, R.string.info3,
  34.  
  35. 18 R.string.info4, R.string.info5, R.string.info6,
  36.  
  37. 19 R.string.info7, R.string.info8, R.string.info9,
  38.  
  39. 20 R.string.info10, R.string.info11
  40.  
  41. 21 };
  42.  
  43. 22 private Context lContext; //上下文
  44.  
  45. 23 private List<Integer> listIcon = new ArrayList<Integer>(); //图标集合
  46.  
  47. 24 private List<Integer> listName = new ArrayList<Integer>(); //名称集合
  48.  
  49. 25 private List<Integer> listInfo = new ArrayList<Integer>(); //信息集合
  50.  
  51. 26 public Adapter(Context context) {
  52.  
  53. 27 lContext = context;
  54.  
  55. 28 //设置菜单行数与行内图标、名称、信息
  56.  
  57. 29 for (int i = 0; i < 11; i++) {
  58.  
  59. 30 listIcon.add(icons[i]);
  60.  
  61. 31 listName.add(names[i]);
  62.  
  63. 32 listInfo.add(infos[i]);
  64.  
  65. 33 }
  66.  
  67. 34 }

(7)重写MyViewHolder onCreateViewHolder()方法,在该方法中实现获取列表中,每行item的布局文件。修改后代码如下:

  1. 01 @Override
  2.  
  3. 02 public MyViewHolder onCreateViewHolder(ViewGroup arg0, int arg1) {
  4.  
  5. 03 //获取列表中,每行的布局文件
  6.  
  7. 04 View view = LayoutInflater.from(lContext).inflate(R.layout.layout_item, arg0, false);
  8.  
  9. 05 MyViewHolder holder = new MyViewHolder(view); //
  10.  
  11. 06 return holder;
  12.  
  13. 07 }

(8)重写onBindViewHolder()方法,在该方法中设置列表菜单中item(子项)所显示的内容。修改后代码如下:

  1. 01 @Override
  2.  
  3. 02 public void onBindViewHolder(final MyViewHolder holder, int position) {
  4.  
  5. 03 //设置图标
  6.  
  7. 04 holder.img.setBackgroundResource(listIcon.get(position));
  8.  
  9. 05 //设置名称
  10.  
  11. 06 holder.name.setText(listName.get(position));
  12.  
  13. 07 //设置信息
  14.  
  15. 08 holder.info.setText(listInfo.get(position));
  16.  
  17. 09 }

(9)重写getItemCount()方法,在该方法中实现返回数据集中的项目总数。修改后代码如下:

  1. 01 @Override
  2.  
  3. 02 public int getItemCount() {
  4.  
  5. 03 return listIcon.size();
  6.  
  7. 04 }

(10)打开主活动MainActivity.java文件,定义所需要的全局变量,在onCreate()方法中首先获取RecyclerView组件,然后为其设置列表布局管理器,最后为其设置适配器。具体代码如下:

  1. 01 public class MainActivity extends AppCompatActivity {
  2.  
  3. 02 private RecyclerView lRecyclerView; //列表控件
  4.  
  5. 03 private Adapter lAdapter; //适配器
  6.  
  7. 04 @Override
  8.  
  9. 05 protected void onCreate(Bundle savedInstanceState) {
  10.  
  11. 06 super.onCreate(savedInstanceState);
  12.  
  13. 07 setContentView(R.layout.activity_main);
  14.  
  15. 08 //获取列表控件
  16.  
  17. 09 lRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
  18.  
  19. 10 //设置列表布局管理
  20.  
  21. 11 lRecyclerView.setLayoutManager(new LinearLayoutManager(this));
  22.  
  23. 12 //设置适配器
  24.  
  25. 13 lRecyclerView.setAdapter(lAdapter = new Adapter(this));
  26.  
  27. 14 }
  28.  
  29. 15 }

(10)在工具栏中,找到下拉列表框,然后单击要运行的应用(这里为QQMessageList),再单击右侧的运行按钮,运行效果如图27.27所示。

图27.27  模拟QQ消息列表

本文来自明日科技即将出版的《Android开发详解》,转载请注明出处!!!

RecyclerView的基础用法的更多相关文章

  1. PropertyGrid控件由浅入深(二):基础用法

    目录 PropertyGrid控件由浅入深(一):文章大纲 PropertyGrid控件由浅入深(二):基础用法 控件的外观构成 控件的外观构成如下图所示: PropertyGrid控件包含以下几个要 ...

  2. logstash安装与基础用法

    若是搭建elk,建议先安装好elasticsearch 来自官网,版本为2.3 wget -c https://download.elastic.co/logstash/logstash/packag ...

  3. elasticsearch安装与基础用法

    来自官网,版本为2.3 注意elasticsearch依赖jdk,2.3依赖jdk7 下载rpm包并安装 wget -c https://download.elastic.co/elasticsear ...

  4. BigDecimal最基础用法

    BigDecimal最基础用法 用字符串生成的BigDecimal是不会丢精度的. 简单除法. public class DemoBigDecimal { public static void mai ...

  5. Vue组件基础用法

    前面的话 组件(Component)是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.根据项目需求,抽象出一些组件,每个组件里包含了展现.功能和样式.每个页面,根据自己所需, ...

  6. Smarty基础用法

    一.Smarty基础用法: 1.基础用法如下 include './smarty/Smarty.class.php';//引入smarty类 $smarty = new Smarty();//实例化s ...

  7. 前端自动化测试神器-Katalon的基础用法

    前言 最近由于在工作中需要通过Web端的功能进行一次大批量的操作,数据量大概在5000左右,如果手动处理, 完成一条数据的操作用时在20秒左右的话,大概需要4-5个人/天的工作量(假设一天8小时的工作 ...

  8. Bootstrap fileinput:文件上传插件的基础用法

    官网地址:http://plugins.krajee.com/ 官网提供的样例:http://plugins.krajee.com/file-input/demo 基础用法一 导入核心CSS及JS文件 ...

  9. asyncio 基础用法

    asyncio 基础用法 python也是在python 3.4中引入了协程的概念.也通过这次整理更加深刻理解这个模块的使用 asyncio 是干什么的? asyncio是Python 3.4版本引入 ...

随机推荐

  1. 《零压力学Python》 之 第四章知识点归纳

    第四章(决策和循环)知识点归纳 if condition: indented_statements [ elif condition: Indented_statements] [else: Inde ...

  2. LINUX应用开发(面试)

    LINUX应用开发工程师职位 本试卷从考试酷examcoo网站导出,文件格式为mht,请用WORD/WPS打开,并另存为doc/docx格式后再使用 说明:应用开发可考察的点非常多,关键的还是C语言和 ...

  3. Navicat premium连接Oracle报ORA-12545错误

    1:ORA-12545 原因: 这里填localhost,127.0.0.1,或者远程ip.

  4. poj3233 题解 矩阵乘法 矩阵快速幂

    题意:求S = A + A2 + A3 + … + Ak.(mod m) 这道题很明显可以用矩阵乘法,但是这道题的矩阵是分块矩阵, 分块矩阵概念如下:当一个矩阵A中的单位元素aij不是一个数值而是一个 ...

  5. 同余方程 2012年NOIP全国联赛提高组

    时间限制: 1 s   空间限制: 128000 KB 题目描述 Description 求关于 x 同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入描述 Input Descriptio ...

  6. NEMA-0183(GPRMC GPGGA)详细解释

    NEMA-0183(GPRMC GPGGA)详细解释 nmea数据如下:  $GPGGA,121252.000,3937.3032,N,11611.6046,E,1,05,2.0,45.9,M,-5. ...

  7. kendo Grid的toolbar自定义

    由于这个toolbar官方进增加了create,save还有一个是_____ 所以想要自定义话就需要使用 下面的代码(这个是MVVM模式) data-toolbar='[{ template: Ken ...

  8. 洛谷——P1505 苹果摘陶陶

    题目背景 根据2005年的Noip普及组第一题衍生出的一题. 但是有一点点的恶搞成分在里面..... 题目描述 话说去年苹果们被陶陶摘下来后都很生气,于是就用最先进的克隆技术把陶陶克隆了好多份> ...

  9. 使用Genymotion无法连接网络设置代理

    A.) Genymotion 的 Proxy 设置 , 在Android的设置 -> 无线网络 -> Wi-Fi 之中 1.) 在 设置 -> 无线网络 -> Wi-Fi 里面 ...

  10. android 添加一个按键键值【转】

    本文转载自:http://blog.csdn.net/u012719256/article/details/52526046 1.frameworks/base/data/keyboards/Gene ...