RecyclerView基础用法

RecyclerView基础用法



  • 理论说明
  • 代码实例
  • 事件处理




第一章 理论说明

第01节 基础概述

RecyclerView 是ListView 的进阶版本,相比 ListView 来说,他的操作更加灵活,可以根据布局容器的不同,展示出不同的效果出来。
从肉眼观察的角度来说,RecyclerView而言,与 ListView 非常的类似。



第02节 操作步骤

1. 需要导入 RecyclerView 的依赖,在 gradle 当中
2. 在布局文件当中定义 RecyclerView 的控件对象
3. 需要在 Activity 当中找到 RecyclerView 的对象
4. 准备数据 Context 和 集合等数据,传递给适配器 Adapter 的对象, 通过 RecyclerView 去设置适配器,传递参数。
5. 需要给 RecyclerView 去设置布局容器,才能进行结果的展示
6. 如果需要给 RecyclerView 添加事件处理,则需要在适配器当中自己去定义事件监听的接口,调用事件的监听



第二章 代码实例

第01节 导入依赖

1、位置

在 Gradle Scripts 的 build.gradle 当中找到 dependencies 当中引入依赖。

2、代码

implementation  'androidx.recyclerview:recyclerview:1.1.0'



第02节 布局和查找

1、布局

res/layout/activity_main.xml 里面定义控件的信息。控件信息如下:

<androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

2、查找

java/activity 当中找到对应的 View 的对象

public class MainActivity extends AppCompatActivity{
  
  	@Override
  	protected void onCreate(Bundle savedInstanceState){
      	super.onCreate(savedInstanceState);
      	//找到视图信息
      	RecyclerView  rv = this.findViewById(R.id.rv);
    }
}



第03节 适配器基础

1、大纲

1. 需要写一个类,去继承 RecyclerView.Adapter<xxx.MyHolder> 类. 在我们继承当前类的同时,会实现系列的方法。
2. 具体实现的方法如下:
  	A. onCreateViewHolder 方法,该方法的作用是创建 Holder 的对象。方法当中的实现方式,只需要采用 View.inflate(......) 即可
		B. onBindViewHolder 方法, 该方法的作用是给 Holder 当中的控件视图去绑定数据
		C. getItemCount() 方法, 该方法的作用是返回当前的 RecyclerView 一共有多少的条目数
3. 额外的操作方式:
  	A. 成员变量 context 上下文和集合数据  ArrayList<JavaBean>
		B. 构造方法 提供无参数构造方法 和 上述两个成员变量的构造方法
4. 关于 ViewHolder 的内部类信息
		需要在构造方法当中,初始化 View 的视图信息,加载的布局文件当中的控件信息

2、代码

/*
		写一个类去继承 RecyclerView.Adapter 
		在泛型当中指定 MyAdapter的MyHolder的对象
*/
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> {
  	//作为视图转换器需要的上下文的对象,需要绑定的集合数据
    private Context context;
    private List<Student> mlist;

    public MyAdapter() {
    }

  	//最开始需要加载的 ViewHolder的视图,将得到的视图对象,传递给构造方法参数
    @NonNull
    @Override
    public MyAdapter.MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = View.inflate(context,R.layout.recyclery_item,null);
        return new MyHolder(itemView);
    }

  	//绑定视图的操作
    @Override
    public void onBindViewHolder(@NonNull MyAdapter.MyHolder holder, int position) {
        holder.tv.setText(mlist.get(position).getName());
    }

  	//返回当前需要加载的 RecyclerView的视图条目总数
    @Override
    public int getItemCount() {
        return mlist==null?0:mlist.size();
    }

  	//构造方法,用于参数的传递
    public MyAdapter(Context context, List<Student> mlist) {
        this.context = context;
        this.mlist = mlist;
    }

  	//需要绑定的 ViewHolder 的对象
    protected class MyHolder extends RecyclerView.ViewHolder {
        private TextView tv;
        public MyHolder(@NonNull View itemView) {
            super(itemView);
            tv = itemView.findViewById(R.id.tv);
        }
    }
}



第04节 数据视图绑定

1、大纲

在 Activity 当中,如果我们找到了 RecyclerView 的对象,可以通过两个操作之后,直接进行数据的展示:
	1、设置布局管理器
	2、设置适配器(适配器构造方法当中,需要传递集合数据和上下文的对象)

2、代码

/*
	Activity的代码实现
*/
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
				//找到视图的操作
        RecyclerView rv = this.findViewById(R.id.rv);
        //绑定数据
        List<Student> mlist = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            mlist.add(new Student("姓名:"+i));
        }
        //设置布局管理器
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        rv.setLayoutManager(layoutManager);
        //设置适配器
        MyAdapter adapter = new MyAdapter(this,mlist);
        rv.setAdapter(adapter);
    }
}



第三章 事件处理

第01节 基础概述

1、简述

在 RecyclerView 当中,并没有像 ListView 一样,存在直接处理的 ItemOnClickListener 的方法,需要我们手动的指定方法的形式。

那么如何去指定事件处理呢?
	1、在 Adapter 里面需要去定义事件处理的回调接口  OnItemClickListener
	2、在 OnItemClickListener 接口当中定义,每个Item事件的处理抽象方法,方法当中需要传递 position 位置参数
	3、将接口 OnItemClickListener 对象定义成为成员变量,并且提供 setXxxx 方法以供外界的 adapter 对象去调用
	4、在内部类的 Holder 当中,给 itemView 去绑定点击事件的处理,处理的过程当中,套用自定义的事件监听
	5、在 Activity 当中,采用 adapter 对象去调用 setXxxx方法,注册事件监听

2、细节

1. 需要在适配器内部,注册事件处理的接口,并且提供 setXxxx 方法,暴露给外部,进行事件的注册效果
2. 在 Holder 当中设置的是点击事件处理,点击事件的内部,判断监听器对象,调用条目项的事件监听
3. 在 Activity 当中,采用的是 adapter去监听事件,而不是 RecyclerView 去进行事件的监听



第02节 案例代码

1、适配器

下面的代码是来自于 Adapter 内部的代码实现

protected class MyHolder extends RecyclerView.ViewHolder {

    private TextView tv;
    public MyHolder(@NonNull View itemView) {
        super(itemView);
        tv = itemView.findViewById(R.id.tv);
        //设置事件的绑定效果
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onItemClickLinstener!=null){
                    onItemClickLinstener.itemClick(getAdapterPosition());
                }
            }
        });
    }
}

//设置事件处理
private OnItemClickLinstener onItemClickLinstener;

public void setOnItemClickLinstener(OnItemClickLinstener onItemClickLinstener) {
    this.onItemClickLinstener = onItemClickLinstener;
}

public interface OnItemClickLinstener{
    void itemClick(int position);
}

2、Activity

//设置适配器
MyAdapter adapter = new MyAdapter(this,mlist);
rv.setAdapter(adapter);

//设置事件处理
adapter.setOnItemClickLinstener(new MyAdapter.OnItemClickLinstener() {
    @Override
    public void itemClick(int position) {
        Log.e("hello", "itemClick: -->"+position );
    }
});



上一篇:从零开始学css-postition


下一篇:Sticky 黏性定位 兼容性css3