RecyclerView基础用法(下)
- 效果展示
- 准备操作
- 核心代码
第一章 效果展示
第01节 列表效果
左图为:纵向列表的效果
右图为:横向列表的效果
第02节 网格效果
左图为:纵向网格的效果
右图为:横向网格的效果
第二章 准备操作
第01节 定义布局
1、位置
在 res/layout
的布局文件当中, 定义 recyclerView
视图
2、代码
代码如下:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recy"
android:layout_width="match_parent"
android:layout_height="match_parent" />
第02节 定义数据
1、位置
1. 需要定义 JavaBean 的对象, 提供 Getter 和 Setter 方法 以及构造方法
2. 需要定义 图片资源文件信息, 定义在 res/mipmap 资源文件当中
3. 需要初始化集合数据 List<JavaBean> 形式, 保存到 MainActivity 当中
2、代码
JavaBean 的代码实现
package chc.svip;
public class CarBean {
private int image;
private String name;
public CarBean() {
}
public CarBean(int image, String name) {
this.image = image;
this.name = name;
}
public int getImage() {
return image;
}
public void setImage(int image) {
this.image = image;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
图标的资源信息
在 MainActivity
里面,初始化集合数据
//集合数据, 添加CarBean对象到集合当中
List<CarBean> mlist = new ArrayList<>();
mlist.add(new CarBean(R.mipmap.im_01aichegujiabeifen, "001"));
mlist.add(new CarBean(R.mipmap.im_02aichegujiabeifen, "002"));
mlist.add(new CarBean(R.mipmap.im_03aichegujiabeifen, "003"));
mlist.add(new CarBean(R.mipmap.im_04baoyangshoucebeifen, "004"));
mlist.add(new CarBean(R.mipmap.im_05maichepin, "005"));
mlist.add(new CarBean(R.mipmap.im_06maichexianbeifen, "006"));
mlist.add(new CarBean(R.mipmap.im_07mendian, "007"));
mlist.add(new CarBean(R.mipmap.im_08weixiu, "008"));
mlist.add(new CarBean(R.mipmap.im_09wodekanjia, "009"));
mlist.add(new CarBean(R.mipmap.im_10xinchebaojia, "010"));
mlist.add(new CarBean(R.mipmap.im_11youkachongzhi, "011"));
mlist.add(new CarBean(R.mipmap.im_12zhibomaiche, "012"));
mlist.add(new CarBean(R.mipmap.im_13zhuanchezhuanyongbeifen, "013"));
mlist.add(new CarBean(R.mipmap.im_14zhuanjiadayibeifen, "014"));
mlist.add(new CarBean(R.mipmap.im_15zizhuxiche, "015"));
mlist.add(new CarBean(R.mipmap.im_16zuobaoyang, "016"));
第三章 核心代码
第01节 适配器
1、说明
1. 写一个类,继承 RecyclerView.Adapter<CarAdapter.ViewHolder>
2. 需要定义如下的内容:
第一部分: 适配器自带的方法
A. onCreateViewHolder 创建ViewHolder的方法,内部使用视图转换器获取 LayoutInfalter..
B. onBindViewHolder 绑定ViewHolder的视图和集合数据,另外还可以给列表项当中,单独的控件设置点击事件
C. getItemCount 设置适配器需要匹配的条目数,通常返回的是集合的长度大小
D. 构造方法 和 集合成员变量,主要用于创建适配器对象的时候,进行参数传递,将集合数据传递给适配器
第二部分: ViewHolder内部类部分
A. 需要定义成员变量, 主要是列表的视图控件对象
B. 构造方法, 在构造方法当中, 采用 findViewById 找到视图控件
2、代码
package chc.svip;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
/***
* 定义一个适配器 CarAdapter 需要继承 RecyclerView.Adapter<CarAdapter.ViewHolder>
*
* 1. ViewHolder: class ViewHolder --> onCreateViewHolder --> onBindViewHolder
*
* 2. 适配器类的方法: 构造方法 ---> getItemCount()
*/
public class CarAdapter extends RecyclerView.Adapter<CarAdapter.ViewHolder> {
private static final String TAG = "chc";
private List<CarBean> mlist;
/***
* 构造方法传递的参数,主要是列表项的集合数据
* @param mlist
*/
public CarAdapter(List<CarBean> mlist) {
this.mlist = mlist;
}
/***
* 自己内部定义的 静态内部类 ViewHolder 需要继承 RecyclerView.ViewHolder
*
* 其中的构造方法当中,需要初始化每一项的 子控件的对象
*/
static class ViewHolder extends RecyclerView.ViewHolder{
ImageView imageView;
TextView textView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.item_iamge);
textView = itemView.findViewById(R.id.item_text);
}
}
/****
* 创建了 ViewHolder 的对象,该方法的作用,主要是将 布局文件 转换成为 ViewHolder的对象
* @param parent
* @param viewType
* @return
*/
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//布局视图转换器, 需要注意上下文对象的获取,采用的是 parent 来获取得到的
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent,false);
//将视图转换成为 ViewHolder 的对象
ViewHolder holder = new ViewHolder(view);
return holder;
}
/****
* 绑定 ViewHolder 的操作, 在这里可以完成视图和数据的绑定
* 视图: 来自于 holder 对象当中,通过视图转换器得到的
* 数据: 来自于 集合对象当中,通过 position 索引得到的
* 同时可以在这里完成事件的处理啊
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.imageView.setImageResource(mlist.get(position).getImage());
holder.textView.setText(mlist.get(position).getName());
//设置事件处理
holder.textView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Log.i(TAG, "onClick: ---> TextView OnClickLinstener");
}
});
//设置事件处理
holder.imageView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Log.i(TAG, "onClick: ---> ImageView OnClickLinstener");
}
});
}
/***
* 获取到一共存在多少个条目数
* @return
*/
@Override
public int getItemCount() {
return mlist.size();
}
}
第02节 Activity代码
1、说明
1. 初始化集合的数据
2. 主要是通过 findViewById 找到 recyclerView 的控件对象
3. 创建布局管理器的对象,这里可以切换不同的布局管理器对象,得到不同的效果展示
4. 设置适配器的对象
2、代码
//通过id找到控件 recyclerView 的对象
RecyclerView recycler = this.findViewById(R.id.recy);
//设置线性布局管理器,设置方向为水平方向. 类似于 横向展示的 ListView列表效果
//设置线性布局管理器,设置方向为垂直方向. 类似于 纵向展示的 ListView列表效果
//LinearLayoutManager manager = new LinearLayoutManager(this);
//manager.setOrientation(LinearLayoutManager.HORIZONTAL);
//manager.setOrientation(LinearLayoutManager.VERTICAL);
//设置 GridView 的效果, 可以实现布局
//其中 3 表示共计每行展示3个列表项
//StaggeredGridLayoutManager.HORIZONTAL 表示水平方向展示的效果
//StaggeredGridLayoutManager.VERTICAL 表示垂直方向展示的效果
//StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.HORIZONTAL);
//需要设置布局管理器在 recyclerView 上面才能生效
recycler.setLayoutManager(manager);
//设置适配器,传递集合数据给适配器上
recycler.setAdapter(new CarAdapter(mlist));