RecyclerView的基础用法
为了让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的基础用法的更多相关文章
- PropertyGrid控件由浅入深(二):基础用法
目录 PropertyGrid控件由浅入深(一):文章大纲 PropertyGrid控件由浅入深(二):基础用法 控件的外观构成 控件的外观构成如下图所示: PropertyGrid控件包含以下几个要 ...
- logstash安装与基础用法
若是搭建elk,建议先安装好elasticsearch 来自官网,版本为2.3 wget -c https://download.elastic.co/logstash/logstash/packag ...
- elasticsearch安装与基础用法
来自官网,版本为2.3 注意elasticsearch依赖jdk,2.3依赖jdk7 下载rpm包并安装 wget -c https://download.elastic.co/elasticsear ...
- BigDecimal最基础用法
BigDecimal最基础用法 用字符串生成的BigDecimal是不会丢精度的. 简单除法. public class DemoBigDecimal { public static void mai ...
- Vue组件基础用法
前面的话 组件(Component)是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.根据项目需求,抽象出一些组件,每个组件里包含了展现.功能和样式.每个页面,根据自己所需, ...
- Smarty基础用法
一.Smarty基础用法: 1.基础用法如下 include './smarty/Smarty.class.php';//引入smarty类 $smarty = new Smarty();//实例化s ...
- 前端自动化测试神器-Katalon的基础用法
前言 最近由于在工作中需要通过Web端的功能进行一次大批量的操作,数据量大概在5000左右,如果手动处理, 完成一条数据的操作用时在20秒左右的话,大概需要4-5个人/天的工作量(假设一天8小时的工作 ...
- Bootstrap fileinput:文件上传插件的基础用法
官网地址:http://plugins.krajee.com/ 官网提供的样例:http://plugins.krajee.com/file-input/demo 基础用法一 导入核心CSS及JS文件 ...
- asyncio 基础用法
asyncio 基础用法 python也是在python 3.4中引入了协程的概念.也通过这次整理更加深刻理解这个模块的使用 asyncio 是干什么的? asyncio是Python 3.4版本引入 ...
随机推荐
- for循环提高内存访问效率的做法
今天写程序的时候突然想到一点,记录一下: 计算机内存地址是线性排列组织的,而利用for循环对高维数组结构进行遍历处理的时候,要保证最内层for循环遍历的是高维数组的最低维度,这样可以最大化利用CPU的 ...
- hdu 5171 GTY's birthday gift
GTY's birthday gift 问题描述 GTY的朋友ZZF的生日要来了,GTY问他的基友送什么礼物比较好,他的一个基友说送一个可重集吧!于是GTY找到了一个可重集S,GTY能使用神犇魔法k次 ...
- Cookie的Python爬虫应用
Cookie的Python爬虫应用 目录 Cookie是什么 Cookie的作用 Cookie的内容 domain属性 path属性 expires/Max-Age属性 Cookie的爬虫应用 Coo ...
- 【codeforces 760D】Travel Card
[题目链接]:http://codeforces.com/contest/760/problem/D [题意] 去旅行,有3种类型的乘车票; 第一种:只能旅行一次20元 第二种:按时间计算,90分钟内 ...
- [luoguP2870] [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold(后缀数组)
传送门 数据小的话贪心就行. 可以把这个串翻转再接到后面,再求后缀数组,求出 rank 数组就很简单了. ——代码 #include <cstdio> #include <iostr ...
- Grails里DOMAIN类的一对一,一对多,多对多关系总结及集成测试
终于干完这一章节,收获很多啊. 和DJANGO有类似,也有不同. User.groovy: package com.grailsinaction class User { String loginId ...
- [转]十五天精通WCF——终结篇 那些你需要注意的坑
终于一路走来,到了本系列的最后一篇了,这一篇也没什么好说的,整体知识框架已经在前面的系列文章中讲完了,wcf的配置众多,如果 不加一些指定配置,你可能会遇到一些灾难性的后果,快来一睹为快吧. 一: 第 ...
- Clojure:通过cursive连接远程REPL服务器
配置很简单,步骤如下:1. 选择Edit Configurations…2. 选择Clojure REPL -> Remote3. 输入远程服务器的ip和端口. 最后点运行就可 ...
- IntelliJ IDEA 在左右两侧出现Project、Maven Project等导航按钮
IntelliJ IDEA 在左右两侧出现Project.Maven Project等导航按钮 选中 View > Tool Buttons 可以查看Project.Maven Project等 ...
- Android之QQ授权登录获取用户信息
有时候我们开发的app须要方便用户简单登录.能够让用户使用自己的qq.微信.微博登录到我们自己开发的app. 今天就在这里总结一下怎样在自己的app中集成QQ授权登录获取用户信息的功能. 首先我们打开 ...