RecyclerView 是一个容器,显示大量数据集合,提供了更多的灵活性和可定制的布局,实现各种复杂的布局效果和动画效果,适用于各种需要列表或网格显示的Android应用,无论是简单的联系人列表还是复杂的瀑布流布局,甚至是在列表项中嵌入复杂交互,RecyclerView都能胜任。
一、基本概念
- 工作原理:RecyclerView通过回收(recycling)机制来优化性能。当子项滑出屏幕时,其视图并不会被销毁,而是被放入一个缓存队列中,等待被重新使用。当新的子项需要显示时,RecyclerView会从缓存队列中取出之前创建的视图并重新绑定数据,从而避免了不必要的视图创建和销毁操作。
- ViewHolder:ViewHolder是RecyclerView中用于缓存子项视图的类。每个ViewHolder都持有一个子项视图的引用,从而可以在需要时快速访问和复用视图。
- Adapter:Adapter是连接数据源和RecyclerView的桥梁。通过实现Adapter接口,可以将数据源中的数据映射到RecyclerView的子项视图中,并控制子项视图的创建、绑定和回收。
二、RecyclerView xml布局
RecyclerView的xml布局:
在activity_main中布局,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:layout_editor_absoluteX="1dp"
tools:layout_editor_absoluteY="1dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
数据项布局
自定义显示的数据item项recy_item.xml布局:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="220dp">
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="160dp"
android:scaleType="fitXY"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:layout_editor_absoluteX="124dp"
tools:layout_editor_absoluteY="16dp"
tools:srcCompat="@tools:sample/avatars" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="TextView"
android:textSize="29dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/imageView"
app:layout_constraintTop_toBottomOf="@+id/imageView" />
</androidx.constraintlayout.widget.ConstraintLayout>
三、数据实体类
新建一个类作为RecycleView数据的实体类:
public class Recycler_item {
Integer imageID;
String name;
public Integer getImageID() {
return imageID;
}
public String getName() {
return name;
}
public Recycler_item(Integer imageID,String name){
this.imageID = imageID;
this.name = name;
}
}
四、适配器Adapter
新建一个类继承RecyclerView.Adapter,并将泛型指定为RecyclerAdapter.VH,VH是在RecyvlerAdapter中定义的一个内部类继承RecyclerView.ViewHolder
,通过继承RecyclerView.ViewHolder
,实现了对ItemView中控件的高效管理和复用。在VH内部,利用itemView.findViewById
进行控件的初始化,确保了视图与数据的高效绑定,VH成为了连接数据模型与视图展示的桥梁,使得RecyclerView的列表展示更加流畅和灵活。具体代码:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.VH> {
List<Recycler_item> list;
public RecyclerAdapter(List<Recycler_item> list){
this.list = list;
}
@NonNull
@Override
public RecyclerAdapter.VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recy_item,parent,false);
VH vh = new VH(view);
return vh;
}
@Override
public void onBindViewHolder(@NonNull RecyclerAdapter.VH holder, int position) {
Recycler_item recycler_item = list.get(position);
holder.imageView_item.setImageResource(recycler_item.getImageID());
holder.textView_item.setText(recycler_item.getName());
}
@Override
public int getItemCount() {
return list.size();
}
public class VH extends RecyclerView.ViewHolder{
ImageView imageView_item;
TextView textView_item;
public VH(@NonNull View itemView) {
super(itemView);
imageView_item = itemView.findViewById(R.id.imageView);
textView_item = itemView.findViewById(R.id.textView);
}
}
}
五、Activity中使用RecyclerView控件
LinearLayoutManager配置
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
定义inRe()私有函数,构建模拟数据
private void inRe() {
for (int i = 0; i < 1000; i++) {
Recycler_item p1 = new Recycler_item(R.drawable.p1,"风景1");
Recycler_item p2 = new Recycler_item(R.drawable.p2,"风景2");
Recycler_item p3 = new Recycler_item(R.drawable.p3,"风景3");
Recycler_item p4 = new Recycler_item(R.drawable.p4,"风景4");
Recycler_item p5 = new Recycler_item(R.drawable.p5,"风景5");
Recycler_item p6 = new Recycler_item(R.drawable.p6,"风景6");
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
list.add(p6);
}
}
最终代码![](https://img-blog.csdnimg.cn/direct/ddad1642ba484fcc8a5294ff537ed186.png)
public class MainActivity extends AppCompatActivity {
List<Recycler_item> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
inRe();
RecyclerView recyclerView = findViewById(R.id.recycler_view);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
RecyclerAdapter adapter = new RecyclerAdapter(list);
recyclerView.setAdapter(adapter);
}
private void inRe() {
for (int i = 0; i < 1000; i++) {
Recycler_item p1 = new Recycler_item(R.drawable.p1,"风景1");
Recycler_item p2 = new Recycler_item(R.drawable.p2,"风景2");
Recycler_item p3 = new Recycler_item(R.drawable.p3,"风景3");
Recycler_item p4 = new Recycler_item(R.drawable.p4,"风景4");
Recycler_item p5 = new Recycler_item(R.drawable.p5,"风景5");
Recycler_item p6 = new Recycler_item(R.drawable.p6,"风景6");
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
list.add(p6);
}
}
}