android开发——RecyclerView解析(详细)

概述

RecyclerView可以轻松高效地显示大量数据。向RecyclerView提供数据并定义外观,RecyclerView库会根据需要动态创建元素。

RecyclerView(循环器视图),顾名思义,RecyclerView会回收视图重复利用。当列表滚动展示区域之外(宽度或高度超出父容器)时,RecyclerView不会销毁视图,而是将视图置于列表滑动方向准备显示的那端。这种渲染方式可以显著提高性能。
image

我们可以通过视图显示其hashcode可以看到,RecylerView确确实实进行了复用。但为确保加载速度,view消失后不会立即显示,而是在另一端排起了队列,预留了一定空间在view进入可视区之前完成数据加载。

image
image

此外,相比于传统的列表视图ListView,RecyclerView在灵活性上要更加强大。例如我们想要进行横向滚动那么使用ListView是做不到的。而RecyclerView通过布局管理器可以轻松实现子项排列方式。

接下来介绍RecyclerView该如何进行使用。

导入依赖

首先我们需要先导入RecylerView的依赖,作为新增插件RecyclerView被Google放置在androidx,如果不预先导入依赖,是无法进行使用的。
如果准备完毕请点击此处跳转到使用

添加依赖方式1

  1. 找到app包下的build.gradle文件并点开
    image

  2. 在dependencies模块添加RecyclerView的依赖

implementation 'androidx.recyclerview:recyclerview:1.1.0

image

  1. 添加完毕后上方就会出现一个提示,大致意思就是检测到文件修改,需要同步。点击sync now进行同步。同步后就完成依赖的添加。
    image

添加依赖方式2

  1. 在java文件中直接打上RecyclerView,RecyclerView此时就会变成红色字体。
    image
  2. 这时我们只需alt+enter就会出现快速添加依赖的选项。
    image
  3. 回车进行添加,约一秒左右添加完毕,此时RecyclerView的字体就变为黑色。
    image

添加依赖方式3

  1. 首先准备一个RecyclerView的jre包
    image
  2. 复制粘贴到app包下的libs包中
    image
  3. 右键点击该包选择Add As Library...
    image

RecyclerView的使用

  1. 首先在xml使用RecyclerView,必须设置id。
    image

  1. 新建一个layout文件,用于定义每个列表项呈现的样式
    image

3. 然后看一下使用RecyclerView的三个小步骤,对RecyclerkView先大致了解一下。
  • 获取RecyclerView组件对象
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycle_list);
  • 创建LinearLayoutManager(线性布局管理器)对象,并为RecyclerView设置该对象。除了线性布局还有GridLayoutManager(网格布局管理器),我们可以通过设置布局管理器对象来定义列表该以什么排列方式进行呈现。
recyclerView.setLayoutManager(new LinearLayoutManager(this));
  • 设置RecyclerView的适配器,传入自定义适配器
recyclerView.setAdapter(new MyAdapter(dataResource));
// 这里MyAdapter是自定义的适配器类,构造方法传入的是数据源,在下面会讲到。

  1. 接着自定义一个适配器类MyAdapter.java(命名没有要求),定义构造方法用于接收数据源。并创建一个静态的内部类ViewHolder继承RecyclerView的内部类ViewHolder。ViewHolder在后面用来分装子项组件。
public class MyAdapter {
    // 用于接收数据源
    private Object[] = null;
    public MyAdapter(Object[] datas){
	this.datas = datas;
    }
    public static class ViewHolder extends RecyclerView.ViewHolder{
	// 成员变量存储view组件,等待getView方法的调用
        private View view = null;
        public ViewHolder(View view){
            // 构造方法调用super()方法传入一个组件的引用
            super(view);
            this.view = view;
        }
	public View getView(){
	    return this.view;
	}
    }
}

  1. 回到MyAdapter类,使得MyAdapter继承RecylerView的内部类Adapter,并且重写三个方法onCreateViewHolder、onBindViewHolder、getItemCount。
public class MyAdapter {
    // 用于接收数据源
    private Object[] = null;
    public MyAdapter(Object[] datas){
	this.datas = datas;
    }
    public static class ViewHolder extends RecyclerView.ViewHolder{
	// 成员变量存储view组件,等待getView方法的调用
        private View view = null;
        public ViewHolder(View view){
            // 构造方法调用super()方法传入一个组件的引用
            super(view);
            this.view = view;
        }
	public View getView(){
	    return this.view;
	}
    }
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
	/**
	  * 该方法用于创建列表子项组件(视图),并且返回。返回的组件是经过ViewHolder包装的实例。
	  * @params parent是根容器
	  * @return 返回列表子项组件(经由ViewHolder包装)
	  */
	/* LayoutInflater类用于在将子项组件逐个添加至列表中。其静态方法from用于设置上下文环境,
	 * inflate方法在程序执行回调的过程,将子项组件逐一添加到根组件容器中也就是root(RecyclerView),
	 * inflate填充完毕后返回View子项组件实例,需要通过ViewHolder封装才能返回,交由onBindViewHolder方法。
	 */
	View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.test_view,parent,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
	/**
	  * 该方法用于数据与子项组件(视图)进行绑定,
	  * @params holder是onCreateViewHolder返回的子项组件
	  *         position是子项组件当前的索引,一般用于与视图与数据的绑定。
	  */
	/* 通过内部类ViewHolder的实例对象调用getView获得View实例,通过向下转型获得组件,
	 * 将数据与视图进行绑定。
	 */
	 View view = holder.getView();
        ((TextView)view.findViewById(R.id.test_title)).setText(datas[position]);
    }

    @Override
    public int getItemCount() {
	/**
	  * @return 返回列表所要展示的子项个数,若要展示全部可以返回数据的长度。
	  */
	  return datas.length;
    }
}

  1. 一切准备就绪后就,就可以像步骤三进行使用
posted @ 2022-09-12 19:50  maplerain  阅读(1783)  评论(0编辑  收藏  举报