RecyclerView使用总结

本文详细介绍RecyclerView的使用方法,包括依赖库添加、布局配置、Adapter设置、点击事件处理及瀑布流布局实现,适合Android开发者快速上手。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

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

效果图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值