简介
RecyclerView是support.v7包中的控件,已经标准化ViewHolder,然后在构造方法中初始化控件。通过设置不同的LayoutManager,可以实现item不同的布局方式。结合ItemDecoration,ItemAnimator,ItemTouchHelper,可以实现Item之间的分割线、动画,滑动拖拽等效果。
简单使用
1.添加依赖库
implementation 'androidx.recyclerview:recyclerview:1.0.0'
2.修改MainActivity的布局
<androidx.recyclerview.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recycler_view">
</androidx.recyclerview.widget.RecyclerView>
3.新增item_recycler布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="50dp"
app:cardElevation="5dp"
app:cardCornerRadius="10dp"
app:cardBackgroundColor="#47b7aa"
android:layout_marginRight="30dp"
android:layout_marginLeft="30dp">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="text"
android:textSize="16dp"
android:gravity="center"
android:id="@+id/text"
android:clickable="true" />
</androidx.cardview.widget.CardView>
</RelativeLayout>
4.在MainAcitivity中获取RecyclerView,并设置LayoutManager以及Adapter
//初始化数据
List<String>datas=new ArrayList<>();
for(int i=0;i<10;i++){
datas.add("item"+i);
}
recyclerView=findViewById(R.id.recycler_view);
//设置LayoutManager为LinearLayoutManager
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//设置Adapter
recyclerView.setAdapter(new GeneralAdapter(this,datas));tas));
其中LayoutManager是RecyclerView的布局管理器,可以实现Item不同布局排列方式,RecyclerView必须调用setLayoutManager设置布局管理器。
5.设置Adapter
public class GeneralAdapter extends RecyclerView.Adapter<GeneralAdapter.MyViewHolder>{
Context context;
List<String>datas;
public GeneralAdapter(@NonNull Context context,List<String>datas) {
this.context=context;
this.datas=datas;
}
//创建ViewHolder
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//实例化得到Item布局文件的view对象
View v=View.inflate(context,R.layout.item_recycler,null);
return new MyViewHolder(v);
}
//绑定数据
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.textView.setText(datas.get(position));
}
//返回item的数量
@Override
public int getItemCount() {
return datas.size();
}
//继承RecyclerView.ViewHolder抽象类的自定义ViewHolder
class MyViewHolder extends RecyclerView.ViewHolder{
TextView textView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textView=itemView.findViewById(R.id.text);
}
}
}
Adapter继承自RecyclerView.ViewHolder抽象类的ViewHolder的泛型约束,即GenaralAdapter.MyViewHolder内部类
RecyclerView.Adapter抽象类有三个必须实现的抽象方法:
public abstract VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType);
public abstract void onBindViewHolder(@NonNull VH holder, int position);
public abstract int getItemCount() ;
效果图:
6.点击事件
在绑定数据时,即onBindViewHolder函数中调用onClick添加事件
public void onBindViewHolder(@NonNull final MyViewHolder holder, int position) {
holder.textView.setText(datas.get(position));
holder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(context,holder.textView.getText()+"被点击了",Toast.LENGTH_SHORT).show();
}
});
}
如果该item被点击,则出现消息itemx被点击了。
7.使用瀑布流布局管理器
StaggeredGridLayoutManager
构造函数:StaggeredGridLayoutManager(int spanCount, int orientation),spanCount代表每行或每列的Item个数,orientation代表列表的方向,竖直或者水平。
设置不同item的高度不同,可以看出瀑布流布局管理器的效果。
以下设置部分item的height为100,其它为200,另创建一个XML文件,与原来的XML文件分别设置两种item的样式。
item1:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.cardview.widget.CardView
android:layout_width="100dp"
android:layout_height="100dp"
app:cardElevation="20dp"
app:cardCornerRadius="10dp"
app:cardBackgroundColor="#90E4DA">
<TextView
android:textColor="#ffffff"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="text"
android:textSize="16dp"
android:gravity="center"
android:id="@+id/text"
android:clickable="true"/>
</androidx.cardview.widget.CardView>
</RelativeLayout>
item2:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.cardview.widget.CardView
android:layout_width="100dp"
android:layout_height="100dp"
app:cardBackgroundColor="#A5DDCF"
app:cardCornerRadius="10dp"
app:cardElevation="20dp">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="text"
android:id="@+id/text"
android:textSize="16dp"
android:clickable="true"/>
</androidx.cardview.widget.CardView>
</RelativeLayout>
修改activity:
recyclerView=findViewById(R.id.recycler_view);
// LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);
// linearLayoutManager.setOrientation(RecyclerView.HORIZONTAL);
//设置LayoutManager为LinearLayoutManager
//recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2,RecyclerView.VERTICAL));
//设置Adapter
recyclerView.setAdapter(new GeneralAdapter(this,datas));
效果图: