RecyclerView超详总结

       RecyclerView 是一个容器,显示大量数据集合,提供了更多的灵活性和可定制的布局,实现各种复杂的布局效果和动画效果,适用于各种需要列表或网格显示的Android应用,无论是简单的联系人列表还是复杂的瀑布流布局,甚至是在列表项中嵌入复杂交互,RecyclerView都能胜任。

一、基本概念

  • 工作原理:RecyclerView通过回收(recycling)机制来优化性能。当子项滑出屏幕时,其视图并不会被销毁,而是被放入一个缓存队列中,等待被重新使用。当新的子项需要显示时,RecyclerView会从缓存队列中取出之前创建的视图并重新绑定数据,从而避免了不必要的视图创建和销毁操作。
  • ViewHolderViewHolder是RecyclerView中用于缓存子项视图的类。每个ViewHolder都持有一个子项视图的引用,从而可以在需要时快速访问和复用视图。
  • AdapterAdapter连接数据源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);
        }
    }
}

六、最终效果

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RecyclerView是一个Android的UI组件,用于在列表或网格中显示大量数据。它可以自动回收不可见的视图,提高性能,并且支持多种布局管理器,如线性布局、网格布局和瀑布流布局等。开发者可以通过适配器来提供数据,并且可以自定义视图的外观和交互。 ### 回答2: RecyclerViewAndroid平台上的一个强大的视图容器,用于展示大量数据的列表或网格布局。它是Android支持库中的一个组件,提供了比ListView更灵活和高效的方式来展示和处理数据。 相比于ListView,RecyclerView具有更好的性能和扩展性。它采用了ViewHolder模式和布局管理器的设计思想,使得列表中的每个列表项都可以重用,并且只加载可见区域的列表项,从而减少了内存消耗和渲染时间。通过适配器(Adapter)和数据集(Dataset)的结合,RecyclerView可以很方便地处理数据的变化和更新,实现了数据的分离和重用。 RecyclerView的布局管理器(Layout Manager)提供了多种布局方式,如线性布局、网格布局、瀑布流布局等,开发者可以根据需求选择合适的布局方式来展示数据。此外,RecyclerView还支持添加分割线、动画效果等,使得列表项具有更加丰富和炫酷的展示效果。 除了基本的数据展示功能,RecyclerView还提供了交互事件的处理接口,如点击、长按、滑动、拖拽等,这使得开发者可以方便地处理用户的交互操作,并实现一些复杂的列表交互效果。 总之,RecyclerViewAndroid开发中常用的一个组件,它通过适配器、布局管理器和数据集的组合,提供了高效、灵活和可扩展的数据展示和交互功能,可以满足各种复杂列表布局和需求。 ### 回答3: RecyclerView是一个在安卓开发中常用的控件,用于展示大量数据。它是ListView的升级版本,相比ListView,RecyclerView可以更灵活地管理和展示数据。 首先,RecyclerView使用了ViewHolder模式来优化视图的复用,减少了内存的占用和视图的创建。通过ViewHolder模式,可以减少findViewById方法的调用次数,提高了列表的滑动性能。 其次,RecyclerView通过LayoutManager来管理视图的布局方式。它提供了多种布局方式,如线性布局、网格布局、瀑布流布局等,开发者可以根据需求自由选择。布局方式的灵活性使开发者可以更好地适应不同的展示效果。 另外,RecyclerView支持动画效果的添加和删除。通过添加ItemAnimator,可以在数据增加或删除时给列表添加动画效果,使用户体验更加丰富。 除此之外,RecyclerView还提供了各种辅助类和接口,如ItemDecoration、ItemTouchHelper等,可以方便地添加分割线、滑动删除等功能。 总的来说,RecyclerView是一种非常强大的控件,适用于展示大量数据的场景。它通过ViewHolder模式、LayoutManager和动画效果等特性,提高了列表的性能和用户体验,为开发者在安卓应用的开发中带来了便利。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值