如何学会使用RecycleView?(基础篇)

  1. 添加依赖:确保你的项目中已经添加了 RecyclerView 的依赖。如果你使用的是 Gradle,可以在 build.gradle 文件的 dependencies 部分添加如下代码:

     

    implementation 'androidx.

    目录

    3. 创建数据模型

    3.1 定义属性

    3.2. 创建构造函数

    3. 3提供 Getter 和 Setter 方法

    3.4 考虑使用 Builder 模式(可选)

    3.5 使用数据模型

    4. 创建 RecyclerView 的布局文件

    5. 创建适配器

    6. 在 Activity 或 Fragment 中使用 RecyclerView


    recyclerview:recyclerview:1.2.1'

  2. 定义布局:在你的布局文件中(例如 activity_main.xml),添加 RecyclerView 控件。

     复制 

    <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent"/>

就拿我做过的实例来看看

我这里就使用了两个RecycleVIiew控件,就拿右边的来说;我们创建好在自己要放在的布局里面后,接下来就是创建数据模型了。

3. 创建数据模型

我现在弄的是一个奶茶商品列表,这时候就可以创建一个 Java 类来表示你的数据模型,比如我的是Drinks.java

                                                                部分事例代码

创建数据模型就是根据你要创建RecycleView控件条目里面要包括的信息,例如,如果你正在创建一个展示奶茶列表的应用程序,你的数据模型可能需要包含奶茶的名称、价格、描述和图片资源ID。

3.1 定义属性

在类中定义私有属性来存储数据。通常,这些属性包括基本数据类型(如 Stringintdouble 等)或更复杂的对象。

public class MilkTea {

private String name; // 奶茶名称

private double price; // 奶茶价格

private String description; // 奶茶描述

private int imageResId; // 奶茶图片资源ID }

3.2. 创建构造函数

为数据模型类创建一个构造函数,允许在创建对象时初始化所有属性。

public MilkTea(String name, double price, String description, int imageResId) { this.name = name;

this.price = price;

this.description = description;

this.imageResId = imageResId; }

3. 3提供 Getter 和 Setter 方法

为每个属性提供公共的 Getter 和 Setter 方法。Getter 方法用于获取属性的值,而 Setter 方法用于设置属性的值。

public String getName() { return name; }

public void setName(String name) { this.name = name; }

public double getPrice() { return price; }

public void setPrice(double price) { this.price = price; }

public String getDescription() { return description; }

public void setDescription(String description) { this.description = description; } public int getImageResId() { return imageResId; }

public void setImageResId(int imageResId) { this.imageResId = imageResId; }

import java.util.ArrayList;

public class Drinks {
    private int number;
    private String name;
    private String type;
    private float price;
    private String introduction;
    private int ImageResId;
    private int guige;


    static private ArrayList<Drinks> all_drinks = new ArrayList<>();//用于存储所有饮品对象

    //该构造函数包含type这个属性,用于初始化包含类别小标题的饮品,即每个类别中的第一个饮品
    Drinks(String name, String type, float price, String introduction, int ImageResId,int guige)
    {
        this.number = all_drinks.size();
        this.name = name;
        this.type = type;
        this.price = price;
        this.introduction = introduction;
        this.ImageResId = ImageResId;
        this.guige=guige;
        all_drinks.add(this);//每项饮品在被初始化后即加入all_drinks列表
    }

    //该构造函数不包含type属性,用于初始化普通不包含小标题的饮品
    Drinks(String name, float price, String introduction, int ImageResId,int guige)
    {
        this.number = all_drinks.size();
        this.type = null; //type属性直接设为null,在与adapter的布局文件进行绑定时,即不会显示类别小标题
        this.name = name;
        this.price = price;
        this.introduction = introduction;
        this.ImageResId = ImageResId;
        this.guige=guige;
        all_drinks.add(this);
    }

    Drinks(int i){
        this.number = i-1;
        Drinks temp = all_drinks.get(i-1);
        this.name = temp.name;
        this.type = temp.type;
        this.price = temp.price;
        this.guige=temp.guige;
        this.introduction = temp.introduction;
        this.ImageResId = temp.ImageResId;
    }



    public int getGuige() {
        return guige;
    }

    public void setGuige(int guige) {
        this.guige = guige;
    }

    public int getnumber()
    {
        return number;
    }

    public String getname()
    {
        return name;
    }

    public String gettype()
    {
        return type;
    }

    public float getprice() { return price;}

    public String getintroduction()
    {
        return introduction;
    }

    public int getImageResId(){return ImageResId;}

    public void setname(String name)
    {
        this.name = name;
    }

    public void set_type(String type)
    {
        this.type = type;
    }

    public void setprice(float price)
    {
        this.price = price;
    }

    public void setIntroduction(String introduction)
    {
        this.introduction = introduction;
    }

    public void setImageResId(int id){this.ImageResId = id;}
}

                                                                   具体示例

3.4 考虑使用 Builder 模式(可选)

对于具有多个属性的类,使用 Builder 模式可以提供更清晰和灵活的方式来构建对象。

public class MilkTea { // 属性...

private MilkTea(Builder builder) { this.name = builder.name;

this.price = builder.price;

this.description = builder.description;

this.imageResId = builder.imageResId; }

// Getter 和 Setter...

public static class Builder { private String name; private double price; private String description; private int imageResId; public Builder setName(String name) { this.name = name; return this; }

public Builder setPrice(double price) { this.price = price; return this; }

public Builder setDescription(String description) { this.description = description; return this; }

public Builder setImageResId(int imageResId) { this.imageResId = imageResId; return this; }

public MilkTea build() { return new MilkTea(this); } } }

3.5 使用数据模型

一旦你定义了数据模型,你可以创建这个类的实例,并将它们添加到一个列表中,这个列表将被用来填充 RecyclerView

List<MilkTea> milkTeaList = new ArrayList<>();

milkTeaList.add(new MilkTea("Bubble Milk Tea", 5.50, "A classic bubble milk tea.", R.drawable.bubble_milk_tea)); // 添加更多奶茶...

4. 创建 RecyclerView 的布局文件

RecyclerView 的每个条目创建一个布局文件,例如 res/layout/item_milk_tea.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="185dp"
    android:padding="16dp">


    <TextView
        android:id="@+id/textViewName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginRight="160dp"
        android:paddingTop="8dp"
        android:text="奶茶名称"
        android:textSize="18sp"
        android:textStyle="bold"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintStart_toEndOf="@+id/imageView39"
        app:layout_constraintTop_toTopOf="@+id/imageView39"
        tools:ignore="MissingConstraints" />

    <TextView
        android:id="@+id/textViewPrice"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:paddingTop="4dp"
        android:text="¥99.00"
        android:textSize="16sp"
        app:layout_constraintEnd_toEndOf="@+id/textViewDescription"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="@+id/textViewDescription"
        app:layout_constraintTop_toBottomOf="@+id/textViewDescription" />

    <TextView
        android:id="@+id/textViewDescription"
        android:layout_width="280dp"
        android:layout_height="45dp"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:paddingTop="4dp"
        android:text="奶茶描述信息"
        android:textSize="14sp"
        app:layout_constraintBottom_toTopOf="@+id/textViewPrice"
        app:layout_constraintEnd_toEndOf="@+id/textViewName"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="@+id/textViewName"
        app:layout_constraintTop_toBottomOf="@+id/textViewName" />

    <ImageView
        android:id="@+id/imageView39"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="20dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:srcCompat="@tools:sample/avatars" />

    <ImageView
        android:id="@+id/imageView45"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="64dp"
        app:layout_constraintBottom_toBottomOf="@+id/textViewPrice"
        app:layout_constraintStart_toEndOf="@+id/textViewPrice"
        app:layout_constraintTop_toTopOf="@+id/textViewPrice"
        app:layout_constraintVertical_bias="1.0"
        app:srcCompat="@mipmap/ic_launcher" />

    <!-- 可以根据需要添加更多视图 -->

</androidx.constraintlayout.widget.ConstraintLayout>

创建 RecyclerView 的布局文件是为了定义列表中每个条目的视图结构和外观,它允许你设计用户界面元素如文本、图片和按钮,设置布局参数以控制条目的尺寸和间距,并实现响应式设计以适应不同屏幕尺寸。此外,布局文件中定义的视图组件可以在 RecyclerView 的适配器中与数据模型绑定,以展示具体内容,同时也可以添加交互逻辑,比如点击事件,从而提升用户体验。

5. 创建适配器

创建一个适配器类,例如 MilkTeaAdapter.java

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class MilkTeaAdapter extends RecyclerView.Adapter<MilkTeaAdapter.MilkTeaViewHolder> {
    private List<Drinks> RightList;


    public MilkTeaAdapter(List<Drinks> RightList) {
        this.RightList = RightList;
    }

    @Override
    public MilkTeaViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_milk_tea, parent, false);
        return new MilkTeaViewHolder(view);

    }

    @Override
    public void onBindViewHolder(MilkTeaViewHolder holder, int position) {
        Drinks drinks = RightList.get(position);
        holder.bind(drinks);
    }

    @Override
    public int getItemCount() {
        return RightList.size();
    }

    public static class MilkTeaViewHolder extends RecyclerView.ViewHolder {
        ImageView imageViewMilktea;
        TextView textViewName;
        TextView textViewPrice;
        TextView textViewDescription;
        ImageView imageViewguige;
        TextView textViewfenge;

        public MilkTeaViewHolder(View itemView) {
            super(itemView);
            imageViewMilktea = itemView.findViewById(R.id.imageView39);
            textViewName = itemView.findViewById(R.id.textViewName);
            textViewPrice = itemView.findViewById(R.id.textViewPrice);
            textViewDescription = itemView.findViewById(R.id.textViewDescription);
            imageViewguige=itemView.findViewById(R.id.imageView45);
        }

        public void bind(Drinks drinks) {
            textViewName.setText(drinks.getname()); // 注意方法名的大小写
            textViewPrice.setText(String.format("¥%.2f", drinks.getprice())); // 同上
            textViewDescription.setText(drinks.getintroduction()); // 使用正确的方法名
            imageViewMilktea.setImageResource(drinks.getImageResId()); // 使用正确的方法名
            imageViewguige.setImageResource(drinks.getGuige());
            imageViewguige.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                }
            });


        }
    }

创建适配器的主要作用是作为 RecyclerView 与数据源之间的中介,负责将数据模型转换为用户界面中的视图。它通过以下方式实现这一功能:

  • 数据绑定:将数据模型绑定到列表的每个条目。数据的获取可以自己输入构造,也可以通过网络请求去获取(我这里是自己输入的数据)
  • 视图创建:生成用于显示数据的视图持有者(ViewHolder)。
  • 视图重用:通过重用机制优化性能,减少视图创建的开销。
  • 交互处理:定义和处理用户与条目的交互,如点击事件。
  • 视图类型管理:在有多种条目类型的情况下,管理不同的视图布局。
  • 数据更新通知:当数据源变化时,通知 RecyclerView 进行相应的视图更新。

6. 在 Activity 或 Fragment 中使用 RecyclerView

   这时候就要回到你创建的RecycleView控件布局所在的Activity或者Fragment文件了,我这里作用到的是我的Fragment文件里

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.youth.banner.Banner;
import com.youth.banner.adapter.BannerImageAdapter;
import com.youth.banner.holder.BannerImageHolder;
import java.util.ArrayList;
import java.util.List;

public class OrderFragment extends Fragment {
    private List<Drinks> drinks_array; // 用于存储饮料数据
    private List<MilkTeaitem>drinks_arrays;
    private RecyclerView recyclerView; // 左侧列表
    private RecyclerView recyclerView1; // 右侧列表
    private CategoryAdapter adapter1; // 左侧列表的适配器
    private MilkTeaAdapter adapter; // 右侧列表的适配器
    private List<MilkTeaitem> LeftList; // 左侧列表数据
    private List<Drinks> RightList; // 右侧列表数据
    private Banner banner; // Banner组件


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        final View view = inflater.inflate(R.layout.fragment_order, container, false);

        drinks_array = new ArrayList<>();
        initData(drinks_array);

        drinks_arrays = new ArrayList<>();
        initCategoryData(drinks_arrays);


        // 初始化数据列表
        LeftList = new ArrayList<>(drinks_arrays);
        RightList = new ArrayList<>(drinks_array);

        // 初始化RecyclerView和适配器
        recyclerView = view.findViewById(R.id.RecyclerView2); // 左侧列表
        recyclerView1 = view.findViewById(R.id.RecyclerView1); // 右侧列表

        // 创建适配器实例
        adapter1 = new CategoryAdapter(LeftList);
        adapter = new MilkTeaAdapter(RightList);

        // 为RecyclerView设置适配器
        recyclerView.setAdapter(adapter1);
        recyclerView1.setAdapter(adapter);

        // 设置LayoutManager为GridLayoutManager,这里以2列为例
        recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 1));
        recyclerView1.setLayoutManager(new GridLayoutManager(getContext(), 1));

        // 初始化Banner
        initView(view);

        return view;
    }

    private void initData(List<Drinks>list) {
        drinks_array.add(new Drinks("牧场酸酪牛油果", "\uD83E\uDDE1 灵感上新",
                23f, "定制牧场奶源酸酪·百分百进口牛油果鲜果·,清爽顺滑", R.drawable.naione,R.drawable.img_27));
        drinks_array.add(new Drinks("喜悦黄果茶", 19f, "匠心甄选黄色系水果·当季芒果·鲜制橙丁百香果,真果无香精",
                R.drawable.naione,R.drawable.img_27));
        drinks_array.add(new Drinks("东坡荔枝生椰露", 19f, "当季新鲜荔枝果肉·定制生椰乳·每日现制西米,椰椰荔香清甜交融",
                R.drawable.naione,R.drawable.img_27));
        drinks_array.add(new Drinks("水牛乳·粉黛玫影", "\uD83C\uDF7C 浓郁牛乳茶",
                15f, "无香精[玫影]玫瑰红茶·优选广西水牛乳调制奶底", R.drawable.naione,R.drawable.img_27));
        drinks_array.add(new Drinks("水牛乳双拼波波",
                19f, "优选广西牧场水牛乳·水牛乳冻·慢数黑糖波波,口感甜腻不喜慎点", R.drawable.naione,R.drawable.img_27));
        drinks_array.add(new Drinks("轻波波牛乳茶",
                15f, "人气轻波波牛乳灵感延伸·慢熬黑糖波波,口感香醇,真牛乳无奶精", R.drawable.naione,R.drawable.img_27));
        drinks_array.add(new Drinks("芋泥牛乳满贯", 18f,
                "芋泥系列大满贯版,5重口感,浓浓芋香,轻盈不腻", R.drawable.naione,R.drawable.img_27));
        drinks_array.add(new Drinks("烤黑糖波波牛乳茶", 19f, "65分钟慢熬黑糖波波·真牛乳·定制嫣红茶底,口感浓厚不喜慎点",
                R.drawable.naione,R.drawable.img_27));
        drinks_array.add(new Drinks("多肉桃李", "\uD83C\uDF51 时令鲜果",
                15f, "当季三华李与当季黄油桃,脆、鲜、甜层层递进", R.drawable.naione,R.drawable.img_27));
        drinks_array.add(new Drinks("芝芝多肉桃桃", 28f, "优选当季新鲜水蜜桃·新岩岚,岩茶·醇香芝士,不添加香精色素",
                R.drawable.naione,R.drawable.img_27));
        drinks_array.add(new Drinks("芝芝多肉青提", 28f, "优选阳光玫瑰青提·鲜果颗颗去皮·无奶精芝士,甜脆香郁。",
                R.drawable.naione,R.drawable.img_27));

        drinks_array.add(new Drinks("芝芝莓莓", 28f,
                "当季新鲜草莓·定制绿妍茶底·无奶精芝士,奶香浓醇,莓香满溢", R.drawable.naione,R.drawable.img_27));
        drinks_array.add(new Drinks("大桶鸭屎香柠茶", "\uD83C\uDF31 简单茗茶",
                18f, "暴打新鲜柠檬·甄选无香精鸭屎香单从茶,超大桶的清爽更解腻", R.drawable.naione,R.drawable.img_27));
        drinks_array.add(new Drinks("芝芝玫影", 13f, "全新[玫影]玫瑰红茶,无香精自然玫瑰香·无奶精芝士,甜醇顺滑",
                R.drawable.naione,R.drawable.img_27));
        drinks_array.add(new Drinks("纯绿妍茶后", 8f, "甄选茶园定制绿妍茶底,淡雅芳幽,默认不加糖,0糖0卡轻负担",
                R.drawable.naione,R.drawable.img_27));

    }

    private void initCategoryData(List<MilkTeaitem>list) {
        drinks_arrays.add(new MilkTeaitem("共同抗疫",R.drawable.img_3));
        drinks_arrays.add(new MilkTeaitem("当季限定",R.drawable.img_3));
        drinks_arrays.add(new MilkTeaitem("人气热卖",R.drawable.img_3));
        drinks_arrays.add(new MilkTeaitem("热饮推荐",R.drawable.img_3));
        drinks_arrays.add(new MilkTeaitem("芋泥系列",R.drawable.img_3));
        drinks_arrays.add(new MilkTeaitem("风味奶茶",R.drawable.img_3));
        drinks_arrays.add(new MilkTeaitem("清甜果茶",R.drawable.img_3));
        drinks_arrays.add(new MilkTeaitem("门店必点",R.drawable.img_3));


    }

    private void initView(View view) {
        // 初始化Banner
        banner = view.findViewById(R.id.banner);

        // 准备图片URL列表
        List<String> list = new ArrayList<>();
        list.add("https://tse1-mm.cn.bing.net/th/id/OIP-C.yYgpzWrZJdfv7gMIs17N5AHaFj?w=240&h=180&c=7&r=0&o=5&dpr=1.3&pid=1.7");
        list.add("https://tse3-mm.cn.bing.net/th/id/OIP-C.snhKF9xa6KcmQ3TrzdDqOAHaE6?w=271&h=180&c=7&r=0&o=5&dpr=1.3&pid=1.7");
        list.add("https://tse1-mm.cn.bing.net/th/id/OIP-C.THZjYEfgWyumsOWdVEgIDgHaEd?w=313&h=189&c=7&r=0&o=5&dpr=1.3&pid=1.7");

        // 设置Banner的适配器
        banner.setAdapter(new BannerImageAdapter<String>(list) {
            @Override
            public void onBindView(BannerImageHolder holder, String data, int position, int size) {
                Glide.with(holder.itemView.getContext())
                        .load(data)
                        .into(holder.imageView);
            }
        });

        // 启动Banner轮播
        banner.start();
    }
}

这段代码是一个 Android Fragment 类的实现,它展示了如何在一个应用程序的片段中使用 RecyclerViewBanner 组件来展示数据。以下是代码的主要步骤和它们的功能解释:

  1. 定义成员变量

    • drinks_array:用于存储 Drinks 类型的数据,代表饮料数据。
    • drinks_arrays:用于存储 MilkTeaitem 类型的数据,代表分类数据。
    • recyclerView 和 recyclerView1:分别代表左侧和右侧的 RecyclerView
    • adapter1 和 adapter:分别为左侧和右侧 RecyclerView 的适配器。
    • LeftList 和 RightList:分别为左侧和右侧 RecyclerView 的数据列表。
    • banner:用于展示图片轮播的 Banner 组件。
  2. onCreateView 方法

    • 这是 Fragment 生命周期中的方法,用于创建和返回 Fragment 的视图。
  3. 视图布局的 Inflate

    • 使用 LayoutInflater 从 fragment_order 布局文件中 Inflate 视图,并将其与 container 连接,但不附加。
  4. 初始化数据

    • 调用 initData() 方法填充 drinks_array
    • 调用 initCategoryData() 方法填充 drinks_arrays
  5. 初始化数据列表

    • 将 drinks_arrays 列表赋值给 LeftListdrinks_array 列表赋值给 RightList
  6. 初始化 RecyclerView

    • 通过 findViewById 获取 RecyclerView 的实例。
    • 为两个 RecyclerView 创建适配器实例并设置适配器。
    • 使用 GridLayoutManager 设置列表的布局管理器,这里设置为每行1个项目。
  7. 初始化 Banner

    • 调用 initView() 方法初始化 Banner 组件。
  8. initData 方法

    • 填充 drinks_array 列表,添加 Drinks 对象,每个对象包含饮料名称、价格、描述、图片资源ID等信息。
  9. initCategoryData 方法

    • 填充 drinks_arrays 列表,添加 MilkTeaitem 对象,每个对象包含分类名称和图片资源ID。
  10. initView 方法

    • 初始化 Banner 组件,设置适配器,并使用 Glide 库加载图片。
    • 准备图片 URL 列表,并为 Banner 设置适配器,将 URL 加载到图片视图中。
    • 启动 Banner 轮播。
  11. 返回视图

    • onCreateView 方法返回 Inflated 的视图,完成 Fragment 的创建。

这段代码演示了如何在 Android Fragment 中集成列表和轮播图,以及如何使用适配器来管理 RecyclerView 的数据和展示。

以上就是我自己学习的RecycleView使用步骤,自己也是觉得很烂!希望大家能相互学习!

  • 24
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值