为了让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垂直列表的具体应用。 实例07 模拟QQ消息列表 实例位置:光盘\Code\SL\27\07 视频位置:光盘\Video 在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消息列表