目录
2.4、设置LayoutManager,setLayoutManager
0、相关视频:
相关文章:
RecyclerView(1)-Decoration源码解析(系列文章)
【进阶】RecyclerView源码解析(一)——绘制流程(系列文章)
图文搞懂RecyclerView 的各部分组成 | RecyclerView进阶
1、简介
RecycleView是Listview和GridView的替代者,在support-v7版本中提供支持。
RecycleView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同的LayoutManager,ItemDecoration,ItemAnimator实现令人炫目的效果。
Listview和GridView能做的RecycleView都能做,并且能实现瀑布流效果。
2、使用
2.1、添加依赖:
implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
2.2、在布局文件中加入recyclerview
2.3、设置Adapter。
注意:继承RecyclerView.Adapter<RvAdapter1.ViewHolder1>,需要自己写一个viewholder。
//设置RecyclerView的适配器
mAdapter = new RvAdapter1(this, datas);
recyclerView.setAdapter(mAdapter);
// 一定要加上这个,否则recyclerView不会显示
recyclerView.setLayoutManager(new LinearLayoutManager(this,
LinearLayoutManager.VERTICAL, false));
public class RvAdapter extends RecyclerView.Adapter<RvAdapter.ViewHolder> {
private final Context context;
private ArrayList<Student> datas;
public RvAdapter(Context context, ArrayList<Student> datas) {
this.context = context;
this.datas = datas;
}
/**
* 类似于 getView() 创建View 和 ViewHolder
*/
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = View.inflate(context, R.layout.item_rv, null);
return new ViewHolder(itemView);
}
/**
* 类似于 getView()绑定数据部分的代码
* 数据和 View 绑定
*/
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
//根据位置得到对应的数据
Student data = datas.get(position);
holder.tvName.setText(data.getName());
}
/**
* 类似于 getCount()
*/
@Override
public int getItemCount() {
return datas.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
private ImageView ivCoin;
private TextView tvName;
public ViewHolder(View itemView) {
super(itemView);
ivCoin = itemView.findViewById(R.id.iv_coin);
tvName = itemView.findViewById(R.id.tv_name);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:padding="5dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="5dp"
android:background="#2000">
<ImageView
android:id="@+id/iv_coin"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@mipmap/keji03" />
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:text="content"
android:textAllCaps="false"
android:textColor="#000"/>
</LinearLayout>
</RelativeLayout>
2.4、设置LayoutManager,setLayoutManager
/**
* LayoutManager 不写LayoutManager 是不会显示的,该段代码用于设置显示方式:list、grid还
是flow
* new LinearLayoutManager() 设置为list格式
*/
recyclerView.setLayoutManager(new LinearLayoutManager(this,
LinearLayoutManager.HORIZONTAL, false));
2.5、添加监听事件
相关文章:给RecyclerView的item添加点击监听事件
使用接口回调的方法为Recycleview 的item 添加点击监听事件
2.5.1、直接添加
一种是直接给item设置一个id,然后按照正常的流程在adapter里面给item添加方法setOnclickListener()。
/**
* 类似于 getView()绑定数据部分的代码
* 数据和 View 绑定
*/
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
//根据位置得到对应的数据
Student data = datas.get(position);
holder.tvName.setText(data.getName());
// 直接添加监听时间
holder.ll.setOnClickListener(v -> LogUtils.d("点击了 " + position));
}
2.5.2、接口回调的方式
2.5.2.1、首先定义一个接口的方法
/**
* 创建一个回调接口
*/
public interface MyItemClickListener {
void onItemClick(View view, int position);
}
2.5.2.2、在adapter中初始化接口
private MyItemClickListener mItemClickListener;
2.5.2.3、在onBindViewHolder中将item点击事件接口传递进去,让接口方法去处理点击事件的逻辑
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
//根据位置得到对应的数据
Student data = datas.get(position);
holder.tvName.setText(data.getName());
holder.itemView.setOnClickListener(v -> {
if (mItemClickListener != null) {
mItemClickListener.onItemClick(v, position);
}
});
}
2.5.2.4、定义一个接口回调的方法给外部调用
A、这里面常用的写法有写一个带参数的set 方法将第二步定义的接口对象传递进去
/**
* 在activity的adapter就是调用这个方法将点击事件传递过来,并赋值给全局监听
* @param myItemClickListener 接口
*/
public void setItemClickListener(MyItemClickListener myItemClickListener) {
this.mItemClickListener = myItemClickListener;
}
然后在acitvity 中通过adapter 的对象去回调
rvAdapter.setItemClickListener((view, position) -> {
LogUtils.d("点击了 " + position);
});
B、或者将OnItemClickListener 接口对象传到adapter的构造函数中去,这样只要实例化adapter对象就会回调了。
public RvAdapter(Context context, ArrayList<Student> datas, MyItemClickListener listener) {
this.context = context;
this.datas = datas;
this.mItemClickListener = listener;
}
// 调用
RvAdapter rvAdapter2 = new RvAdapter(this, mDataList, new RvAdapter.MyItemClickListener() {
@Override
public void onItemClick(View view, int position) {
LogUtils.d("点击了 " + position);
}
});
rvList.setAdapter(rvAdapter2);
public class RvAdapter extends RecyclerView.Adapter<RvAdapter.ViewHolder> {
private final Context context;
private ArrayList<Student> datas;
private MyItemClickListener mItemClickListener;
public RvAdapter(Context context, ArrayList<Student> datas) {
this.context = context;
this.datas = datas;
}
public RvAdapter(Context context, ArrayList<Student> datas, MyItemClickListener listener) {
this.context = context;
this.datas = datas;
this.mItemClickListener = listener;
}
/**
* 类似于 getView() 创建View 和 ViewHolder
*/
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = View.inflate(context, R.layout.item_rv, null);
return new ViewHolder(itemView);
}
/**
* 类似于 getView()绑定数据部分的代码
* 数据和 View 绑定
*/
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
//根据位置得到对应的数据
Student data = datas.get(position);
holder.tvName.setText(data.getName());
// holder.ll.setOnClickListener(v -> LogUtils.d("点击了 " + position));
holder.itemView.setOnClickListener(v -> {
if (mItemClickListener != null) {
mItemClickListener.onItemClick(v, position);
}
});
}
/**
* 类似于 getCount()
*/
@Override
public int getItemCount() {
return datas.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
private LinearLayout ll;
private ImageView ivCoin;
private TextView tvName;
public ViewHolder(View itemView) {
super(itemView);
ll = itemView.findViewById(R.id.ll);
ivCoin = itemView.findViewById(R.id.iv_coin);
tvName = itemView.findViewById(R.id.tv_name);
}
}
/**
* 创建一个回调接口
*/
public interface MyItemClickListener {
void onItemClick(View view, int position);
}
/**
* 在activity的adapter就是调用这个方法将点击事件传递过来,并赋值给全局监听
*
* @param myItemClickListener 接口
*/
public void setItemClickListener(MyItemClickListener myItemClickListener) {
this.mItemClickListener = myItemClickListener;
}
}
rvList = findViewById(R.id.rvList);
rvList.setLayoutManager(new LinearLayoutManager(
this, LinearLayoutManager.VERTICAL, false));
mDataList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Student student = new Student("name" + i, i);
mDataList.add(student);
}
RvAdapter rvAdapter = new RvAdapter(this, mDataList);
rvList.setAdapter(rvAdapter);
rvAdapter.setItemClickListener((view, position) -> {
LogUtils.d("点击了 " + position);
});
// RvAdapter rvAdapter2 = new RvAdapter(this, mDataList, new
RvAdapter.MyItemClickListener() {
// @Override
// public void onItemClick(View view, int position) {
// LogUtils.d("点击了 " + position);
// }
// });
// rvList.setAdapter(rvAdapter2);