手把手教你RecyclerView的详细使用
这个东西其实就是把想要显示的文本一行一行显示在手机页面上(当然是最基本的用法),还可以滑动,点击等等。那我我就创建一个Bean来存放我的文本如上图(String name),通过get set函数就可以实现。然后利用这个东西来实现我们想要的效果。首先创建一个空的Java Bean类和一个RecyclerView的布局,前者的作用是存我们的每一条信息,后者是有一个TextView。
一、准备工作与思想
这个东西其实就是把想要显示的文本一行一行显示在手机页面上(当然是最基本的用法),还可以滑动,点击等等。那我我就创建一个Bean来存放我的文本如上图(String name),通过get set函数就可以实现。然后利用这个东西来实现我们想要的效果。
首先创建一个空的Java Bean类和一个RecyclerView的布局,前者的作用是存我们的每一条信息,后者是有一个TextView。
二、创建Adapter类
我们首先要创建一个adapter为什么要使用这个呢?
重点:因为RecyclerView需要一个Adapter来管理数据和子项视图的创建、绑定和回收,而这个Adapter就是MyAdapter
。RecyclerView本身只是一个容器,它不知道如何展示具体的数据,也不知道如何处理用户的交互。在使用RecyclerView时,需要使用Adapter是因为Adapter负责将数据绑定到RecyclerView中的视图上。Adapter充当了RecyclerView和数据之间的桥梁,它负责创建视图并将数据填充到视图中,以便RecyclerView能够正确地显示数据。明白了吧,举个不恰当的例子,意思就是你想看3d电影就要戴3d眼睛,否则光有眼睛是不能够看清电影的。Adapter就是这个眼睛可以让数据(画面)绑定到Recyclerview(眼睛)里。下面让我们探索一下如何才能戴上3d眼镜。
首先这个类继承了RecyclerView.Adapter<MyAdapter.MyViewHolder>
注:recyclerview需要一个配套一个Adapter同时Adapter需要配置一个Holder。
自定义一个RecyclerView Adapter,用于将数据源中的数据绑定到RecyclerView的子项上。它包含了以下几个关键部分:
- 构造函数:接收数据源和上下文对象。
- onCreateViewHolder:创建ViewHolder对象,加载子项布局。
- onBindViewHolder:将数据绑定到ViewHolder上的控件上。
- getItemCount:获取数据源的数量。
- MyViewHolder类:用于缓存子项布局中的控件,同时设置了子项的点击事件。
- OnRecyclerItemClickListener接口:定义了RecyclerView子项的点击事件监听器。//也就是实现点击
总的来说,这段代码实现了一个通用的RecyclerView Adapter,可用于各种不同的数据展示需求,并且支持子项的点击事件监听。这段代码是最关键的代码,就是我们做3D眼镜的过程,请好好阅读。后面的点击事件可以在3.2里面再看。
package com.example.recyclervieww;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private List<Bean> data ; // 数据源
private Context context; // 上下文对象,用于加载布局
// 构造函数,接收数据源和上下文对象
public MyAdapter(List<Bean> data, Context context) {
this.data = data;
this.context = context;
}
// 创建ViewHolder对象
@NonNull
@Override
public MyAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// 加载子项布局
View view = View.inflate(context, R.layout.recyclerview_item, null);
return new MyViewHolder(view);
}
// 绑定数据到ViewHolder上
@Override
public void onBindViewHolder(@NonNull MyAdapter.MyViewHolder holder, int position) {
// 设置TextView显示数据
holder.tv.setText(data.get(position).getName());
}
// 获取数据源的数量
@Override
public int getItemCount() {
return data == null ? 0 : data.size();
}
// ViewHolder类,用于缓存子项布局中的控件
public class MyViewHolder extends RecyclerView.ViewHolder {
private TextView tv;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
// 找到布局中的TextView控件
tv = itemView.findViewById(R.id.tv);
// 设置子项点击事件
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
// 点击时回调接口方法,并传入点击位置
mOnItemClickListener.onRecyclerItemClick(getAdapterPosition());
}
}
});
}
}
// 点击事件接口
private OnRecyclerItemClickListener mOnItemClickListener;
// 设置点击事件监听器
public void setRecyclerItemClickListener(OnRecyclerItemClickListener listener) {
mOnItemClickListener = listener;
}
// 点击事件接口定义
public interface OnRecyclerItemClickListener {
void onRecyclerItemClick(int position);
}
}
三、使用RecyclerView
一、把数据放进RecyclerView里
总结:
- 创建了一个存储数据的列表
data
。//Bean列表 - 在
onCreate
方法中,启用了边缘到边缘布局,设置了布局文件activity_main
为当前的视图。 - 循环创建了1000个数据对象,并添加到列表
data
中。 - 获取了RecyclerView的实例,并设置了线性布局管理器。
- 创建了适配器实例,并设置给RecyclerView。
- 设置了RecyclerView项的点击事件监听器,当某一项被点击时,会在日志中打印出该项的位置信息。
简单说就是定义一个Bean列表,然后用set函数,在for循环里加入1000条数据,然后在layout里find我们的RecyclerView的id,然后我们给RecyclerView 一种布局这里我展示的是线性布局。注释的是其他布局。用RecyclerView里的setLayoutManager把我们new的布局给RecyclerView,容器创建好后我们就可以把数据放里面了,就用到我们上面所讲的Adapter,下面代码已经给出。
package com.example.recyclervieww;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
// 创建一个存储数据的列表
private List<Bean> data = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 启用边缘到边缘布局
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
// 循环创建数据,并添加到列表中
for (int i = 0; i < 1000; i++) {
Bean bean = new Bean();
bean.setName("老六" + i);
data.add(bean);
}
// 获取RecyclerView控件实例
RecyclerView recyclerView = findViewById(R.id.rv);
// 创建线性布局管理器,并设置给RecyclerView
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
// 创建适配器实例,并设置给RecyclerView
MyAdapter myAdapter = new MyAdapter(data, this);
recyclerView.setAdapter(myAdapter);
// 设置RecyclerView项的点击事件监听器
myAdapter.setRecyclerItemClickListener(new MyAdapter.OnRecyclerItemClickListener() {
@Override
public void onRecyclerItemClick(int position) {
// 当RecyclerView的项被点击时,打印该项的位置信息
Log.e("li", "onRecyclerItemClick: " + position);
}
});
}
}
二、实现点击
点击的实现也是在Adapter里实现,这个思想很简单,首先调用myAdapter.setRecyclerItemClickListener()
方法,将一个匿名内部类的实例传递给了该方法,这个实例实现了OnRecyclerItemClickListener
接口的onRecyclerItemClick()
方法。然后,当RecyclerView中的某个项被点击时,会执行onClick()
方法,其中会检查mOnItemClickListener
是否为null,如果不为null,则调用mOnItemClickListener.onRecyclerItemClick()
方法,并传递当前项的位置参数getAdapterPosition()
让我解释一下:
-
私有成员变量
mOnItemClickListener
: 这是一个私有成员变量,用于存储 RecyclerView 的点击事件监听器。 -
setRecyclerItemClickListener
方法: 这是一个公共方法,用于设置 RecyclerView 的点击事件监听器。通过调用这个方法,可以将一个实现了OnRecyclerItemClickListener
接口的对象传递进去,从而将其设置为 RecyclerView 的点击事件监听器。 -
OnRecyclerItemClickListener
接口: 这个接口定义了一个回调方法onRecyclerItemClick(int position)
,用于处理 RecyclerView 中子项的点击事件。通过实现这个接口,可以在 RecyclerView 的子项被点击时执行相应的操作,例如处理点击事件或执行相应的动作。
在Adapter里我们给每个view(也就是每一行数据)设置一个点击
public MyViewHolder(@NonNull View itemView) {
super(itemView);
tv = itemView.findViewById(R.id.tv);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mOnItemClickListener != null){
mOnItemClickListener.onRecyclerItemClick(getAdapterPosition());
}
}
});
}
}
如何让他知道我们点击了呢?
在mainactivity里,我们把数据塞进recyclerview里后,我们这样做,调用Adapter里的setRecyclerItemClickListener,把点击事件放进adapter里实现。这里我们用一个接口实现
// 设置RecyclerView项的点击事件监听器
myAdapter.setRecyclerItemClickListener(new MyAdapter.OnRecyclerItemClickListener() {
@Override
public void onRecyclerItemClick(int position) {
// 当RecyclerView的项被点击时,打印该项的位置信息
Log.e("li", "onRecyclerItemClick: " + position);
}
});
先说一下使用接口也就是interface的好处,使用接口的好处在于可以实现代码的解耦和灵活性,使得点击事件的处理逻辑与 RecyclerView 的 Adapter 类分离,同时也方便了代码的扩展和维护。
setRecyclerItemClickListener进入Adapter里后,参数是我们定义的接口别名listener,然后调用
onRecyclerItemClick函数把要点击的位置返回来
由于水平有限这里写的很乱,具体Adapter代码上面有,请自行感悟~~
更多推荐
所有评论(0)