一、前言
可以这样说,RecyclerView 的问世,替代了 ListView 和 GridView。RecyclerView 异常的灵活、可自定义并可重复利用的 Item 、高度的解耦,并且通过设置不同的 LayoutManager、ItemDecoration 和 ItemAnimator 可以实现令人瞠目的效果。
ItemDecoration 的相关讲解大家可以看 这篇文章。
源码已经上传至 github,地址在文末中已经给出,可以先下载到本地运行起来,因为具体事例讲解的时候并没有把全部的代码贴出来。
二、与 RecyclerView 配合的类
- LayoutManager:布局管理器,管理 RecyclerView 的展示样式,系统提供了列表、网格和瀑布流三种形式的布局管理器。
- Adapter:适配器,用来处理视图与数据之间的关系。
- ViewHolder:用来容纳 View 视图。
三、案例介绍
我们要实现的最终效果如下所示:
可以看到界面中有四个按钮,分别是添加数据、切换布局,插入一条数据和删除一条数据。当点击添加数据的时候,RecyclerView 就会以线性布局的方式展示出数据,当点击切换布局的时候,RecyclerView 会先切换成网格布局,然后再切换成瀑布流布局,当点击插入和删除数据的时候,RecyclerView 会根据默认的动画来执行,并且动态更新 ItemView 的 position。
四、实现线性布局列表
4.1、引入 RecyclerView
要使用 RecyclerView,首先我们需要在 app 的 build.gradle 中引入 RecyclerView 库。
implementation 'androidx.recyclerview:recyclerview:1.1.0'
4.2、创建适配器
想要把数据展示在列表视图中,就需要通过适配器,所以我们这里创建 MyRecyclerViewAdapter 继承自 RecyclerView 的 Adapter,并实现其中的三个方法,这里我们以内部类的方式来实现 MyViewHolder,同样是继承自 RecyclerView 的 ViewHolder,具体代码如下所示:(源码文末给出)
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {
private Context mContext;
private List<String> dataSource;
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
public MyRecyclerViewAdapter(Context mContext) {
this.mContext = mContext;
this.dataSource = new ArrayList<>();
}
public void setDataSource(List<String> dataSource) {
this.dataSource = dataSource;
notifyDataSetChanged();
}
/**
* 创建并且返回 ViewHolder
*
* @param parent
* @param viewType
* @return
*/
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MyViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_layout, parent, false));
}
/**
* 通过 ViewHolder 来绑定数据
*
* @param holder
* @param position
*/
@Override
public void