问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

RecyclerView超详总结

创作时间:
作者:
@小白创作中心

RecyclerView超详总结

引用
CSDN
1.
https://blog.csdn.net/m0_74225871/article/details/139476194

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);
        }
    }  

最终代码

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);
        }
    }
}  

六、最终效果

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号