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

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

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

<android.support.v7.widget.RecyclerView

    android:id="@+id/my_recycler_view"

    android:scrollbars="vertical"

    android:layout_width="match_parent"

    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组件用于显示消息列表。具体代码如下:

01   <?xml version="1.0" encoding="utf-8"?>

02   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

03       xmlns:app="http://schemas.android.com/apk/res-auto"

04       xmlns:tools="http://schemas.android.com/tools"

05       android:layout_width="match_parent"

06       android:layout_height="match_parent"

07       tools:context="com.mingrisoft.MainActivity">

08       <!--列表控件-->

09       <android.support.v7.widget.RecyclerView

10           android:id="@+id/recyclerview"

11           android:background="#EEEEEE"

12           android:layout_width="match_parent"

13           android:layout_height="wrap_content"

14           android:orientation="vertical"

15           />

16   </RelativeLayout>

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

01   <?xml version="1.0" encoding="utf-8"?>

02   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

03       android:layout_width="match_parent"

04       android:layout_height="50dp"

05       android:layout_marginBottom="1dp"

06       android:background="@android:color/white"

07       android:gravity="center_vertical">

08       <!--图标-->

09       <ImageView

10           android:id="@+id/img"

11           android:layout_width="50dp"

12           android:layout_height="50dp"

13           android:layout_alignParentLeft="true"

14           android:layout_alignParentStart="true"

15           android:layout_alignParentTop="true" />

16       <LinearLayout

17           android:layout_width="wrap_content"

18           android:layout_height="match_parent"

19           android:layout_toRightOf="@+id/img"

20           android:gravity="center_vertical"

21           android:orientation="vertical">

22           <!--名称-->

23           <TextView

24               android:id="@+id/name"

25               android:layout_width="match_parent"

26               android:layout_height="wrap_content"

27               android:layout_marginLeft="20dp"

28               android:textColor="#000000"

29               android:textSize="15dp" />

30           <!--消息-->

31           <TextView

32               android:id="@+id/info"

33               android:layout_width="match_parent"

34               android:layout_height="wrap_content"

35               android:layout_marginLeft="20dp"

36               android:layout_marginRight="15dp"

37               android:singleLine="true"

38               android:textSize="10dp" />

39       </LinearLayout>

40   </RelativeLayout>

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

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

01   public class Adapter extends RecyclerView.Adapter<Adapter.MyViewHolder> {

02       @Override

03       public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

04           return null;

05       }

06       @Override

07       public void onBindViewHolder(MyViewHolder holder, int position) {

08       }

09       @Override

10       public int getItemCount() {

11           return 0;

12       }

13       class MyViewHolder extends RecyclerView.ViewHolder {

14           public TextView name, info;              //编号文字

15           public ImageView img;                     //图标

16    

17           //获取相关控件

18           public MyViewHolder(View itemView) {

19               super(itemView);

20               name = (TextView) itemView.findViewById(R.id.name);

21               info = (TextView) itemView.findViewById(R.id.info);

22               img = (ImageView) itemView.findViewById(R.id.img);

23           }

24       }

25   }

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

01   //图标数组

02   private int[] icons = {

03           R.mipmap.icon_1, R.mipmap.icon_2, R.mipmap.icon_3,

04           R.mipmap.icon_4, R.mipmap.icon_5, R.mipmap.icon_6,

05           R.mipmap.icon_7, R.mipmap.icon_8, R.mipmap.icon_9,

06           R.mipmap.icon_10, R.mipmap.icon_11

07   };

08   //名字数组,引用资源文件中的文字

09   private int[] names = {

10           R.string.name1, R.string.name2, R.string.name3,

11           R.string.name4, R.string.name5, R.string.name6,

12           R.string.name7, R.string.name8, R.string.name9,

13           R.string.name10, R.string.name11

14   };

15   //信息数组

16   private int[] infos = {

17           R.string.info1, R.string.info2, R.string.info3,

18           R.string.info4, R.string.info5, R.string.info6,

19           R.string.info7, R.string.info8, R.string.info9,

20           R.string.info10, R.string.info11

21   };

22   private Context lContext;   //上下文

23   private List<Integer> listIcon = new ArrayList<Integer>();   //图标集合

24   private List<Integer> listName = new ArrayList<Integer>();   //名称集合

25   private List<Integer> listInfo = new ArrayList<Integer>();   //信息集合

26   public Adapter(Context context) {

27       lContext = context;

28       //设置菜单行数与行内图标、名称、信息

29       for (int i = 0; i < 11; i++) {

30           listIcon.add(icons[i]);

31           listName.add(names[i]);

32           listInfo.add(infos[i]);

33       }

34   }

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

01   @Override

02   public MyViewHolder onCreateViewHolder(ViewGroup arg0, int arg1) {

03       //获取列表中,每行的布局文件

04       View view = LayoutInflater.from(lContext).inflate(R.layout.layout_item, arg0, false);

05       MyViewHolder holder = new MyViewHolder(view);           //

06       return holder;

07   }

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

01   @Override

02   public void onBindViewHolder(final MyViewHolder holder, int position) {

03       //设置图标

04       holder.img.setBackgroundResource(listIcon.get(position));

05       //设置名称

06       holder.name.setText(listName.get(position));

07       //设置信息

08       holder.info.setText(listInfo.get(position));

09   }

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

01   @Override

02   public int getItemCount() {

03       return listIcon.size();

04   }

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

01   public class MainActivity extends AppCompatActivity {

02       private RecyclerView lRecyclerView;     //列表控件

03       private Adapter lAdapter;                //适配器

04       @Override

05       protected void onCreate(Bundle savedInstanceState) {

06           super.onCreate(savedInstanceState);

07           setContentView(R.layout.activity_main);

08           //获取列表控件

09           lRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);

10           //设置列表布局管理

11           lRecyclerView.setLayoutManager(new LinearLayoutManager(this));

12           //设置适配器

13           lRecyclerView.setAdapter(lAdapter = new Adapter(this));

14       }

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. Node.js之错误处理

    Node.js之错误处理 1. 使用 domain 模块处理错误 try..catch 多用于捕捉同步方法中的抛出错误,但不能用try..catch捕捉异步方法中抛出de错误 如: 1 var htt ...

  2. [Luogu] P3907 圈的异或

    题目描述 给出无向图G,边 (Ai,Bi)的权是Ci,判断下列性质是否成立: 对于任意圈C,其边权的异或和是0 输入输出格式 输入格式: 第1 行,1 个整数T,表示数据的组数. 每组数据第1 行,2 ...

  3. 到Oracle官网下载 Oracle11 G 数据可和客户端操作

    1.准备一个Oracle的官网账号 用户名:541509124@qq.com 密码:LR4ever.1314 2.在搜索框中输入Oracle 11 G 3.点击Database Downloadds ...

  4. 发现:Click事件也能获取鼠标单击的坐标

    按照MSDN的说明以及平时的习惯,我们要获取鼠标单击时的相对坐标,都会使用MouseClick等事件,今天,偶然发现,原来Click事件也可以. /* 惊天地泣鬼神的考古业绩. * 原来Cilck事件 ...

  5. Golang之路

    目录 Golang之路 Golang之路 Golang(一) - 开篇必须吹牛逼 Golang(二) - 第一个go程序和基本语法 Golang(三) - 函数 Golang(四) - 流程控制 Go ...

  6. 【codeforces 755F】PolandBall and Gifts

    [题目链接]:http://codeforces.com/contest/755/problem/F [题意] n个人; 计划是每个人都拿一个礼物来送给一个除了自己之外的人; 且如果一个人没有送出礼物 ...

  7. JavaSE 学习笔记之多线程(十三)

    多线程: 进程:正在进行中的程序.其实进程就是一个应用程序运行时的内存分配空间. 线程:其实就是进程中一个程序执行控制单元,一条执行路径.进程负责的是应用程序的空间的标示.线程负责的是应用程序的执行顺 ...

  8. NetworkManager

    网络管理器(NetworManager)是检测网络.自动连接网络的程序.无论是无线还是有线连接,它都可以令您轻松管理.对于无线网络,网络管理器优先连接已知的网络并可以自动切换到最可靠的无线网络.利用网 ...

  9. mongoDB全文索引

    相关文章:php使用Coreseek实现全文索引 Introduction Mongo provides some functionality that is useful for text sear ...

  10. hdu_1213_How Many Tables_201403091126

    How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...