提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
如何学会使用RecycleView?(基础篇)
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
一、RecycleView是什么?
RecyclerView 是 Android 开发中的一个灵活的视图组件,用于在应用程序中展示大量数据集。它是 ListView 的进化版,提供了更高的性能和更多的功能。以下是 RecyclerView 的一些关键特性:
高效的滚动性能:RecyclerView 优化了视图的重用机制,能够高效地处理长列表的滚动,减少内存消耗和提高响应速度。
灵活的布局:通过不同的 LayoutManager,RecyclerView 可以支持线性(垂直和水平)、网格、瀑布流等多种布局方式。
丰富的适配器:使用适配器模式,RecyclerView 允许开发者自定义数据与视图之间的绑定逻辑,适配器负责视图的创建和数据的填充。
动画支持:RecyclerView 内置了对添加、删除和更新数据时的动画支持,可以提供流畅的用户体验。
多种视图类型:可以在同一 RecyclerView 中展示不同类型的条目,例如,列表中可以同时包含文本项和图片项。
项目装饰:可以使用 ItemDecoration 类来为条目添加分隔线、边框等装饰效果。
项目动画:可以使用 ItemAnimator 类来自定义条目的添加、移除和更新动画。
空布局支持:可以为没有数据的 RecyclerView 设置自定义的空布局(Empty View)。
适配器数据集观察:RecyclerView 可以自动观察适配器数据集的变化,并更新 UI 以反映这些变化。
二、使用步骤
1.添加依赖
:确保你的项目中已经添加了 RecyclerView 的依赖。如果你使用的是 Gradle,可以在 build.gradle 文件的 dependencies 部分添加如下代码:
代码如下(示例):
implementation 'androidx.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"/>
就拿我做过的实例来看看

我们创建好在自己要放在的布局里面后,接下来就是创建数据模型了。
---!](https://img-blog.csdnimg.cn/direct/6932a20578a64ce9a55a25f1d0297c91.png#pic_center)
# 3.创建数据模型
我现在弄的是一个奶茶商品列表,这时候就可以创建一个 Java 类来表示你的数据模型,比如我的是Drinks.java
```java
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;}
}
这是代码示例
```创建数据模型就是根据你要创建RecycleView控件条目里面要包括的信息,例如,如果你正在创建一个展示奶茶列表的应用程序,你的数据模型可能需要包含奶茶的名称、价格、描述和图片资源ID。以下步骤就是上面代码示例的解释!
3.1 定义属性
在类中定义私有属性来存储数据。通常,这些属性包括基本数据类型(如 String、int、double 等)或更复杂的对象。
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; }
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:

为RecycleView创建条目的布局文件要根据你要设置的样式来调整。
```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>
```这是我图片所示的布局XML文件
创建 RecyclerView 的布局文件是为了定义列表中每个条目的视图结构和外观,它允许你设计用户界面元素如文本、图片和按钮,设置布局参数以控制条目的尺寸和间距,并实现响应式设计以适应不同屏幕尺寸。此外,布局文件中定义的视图组件可以在 RecyclerView 的适配器中与数据模型绑定,以展示具体内容,同时也可以添加交互逻辑,比如点击事件,从而提升用户体验。
# 5.创建适配器
创建一个适配器类,例如 MilkTeaAdapter.java:
```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文件里。
```java
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 类的实现,它展示了如何在一个应用程序的片段中使用 RecyclerView 和 Banner 组件来展示数据。以下是代码的主要步骤和它们的功能解释:
定义成员变量:
drinks_array:用于存储 Drinks 类型的数据,代表饮料数据。
drinks_arrays:用于存储 MilkTeaitem 类型的数据,代表分类数据。
recyclerView 和 recyclerView1:分别代表左侧和右侧的 RecyclerView。
adapter1 和 adapter:分别为左侧和右侧 RecyclerView 的适配器。
LeftList 和 RightList:分别为左侧和右侧 RecyclerView 的数据列表。
banner:用于展示图片轮播的 Banner 组件。
onCreateView 方法:
这是 Fragment 生命周期中的方法,用于创建和返回 Fragment 的视图。
视图布局的 Inflate:
使用 LayoutInflater 从 fragment_order 布局文件中 Inflate 视图,并将其与 container 连接,但不附加。
初始化数据:
调用 initData() 方法填充 drinks_array。
调用 initCategoryData() 方法填充 drinks_arrays。
初始化数据列表:
将 drinks_arrays 列表赋值给 LeftList,drinks_array 列表赋值给 RightList。
初始化 RecyclerView:
通过 findViewById 获取 RecyclerView 的实例。
为两个 RecyclerView 创建适配器实例并设置适配器。
使用 GridLayoutManager 设置列表的布局管理器,这里设置为每行1个项目。
//与使用RecycleView无关
初始化 Banner:
调用 initView() 方法初始化 Banner 组件。
initData 方法:
//
填充 drinks_array 列表,添加 Drinks 对象,每个对象包含饮料名称、价格、描述、图片资源ID等信息。
initCategoryData 方法:
填充 drinks_arrays 列表,添加 MilkTeaitem 对象,每个对象包含分类名称和图片资源ID。
initView 方法:
//
初始化 Banner 组件,设置适配器,并使用 Glide 库加载图片。
准备图片 URL 列表,并为 Banner 设置适配器,将 URL 加载到图片视图中。
启动 Banner 轮播。
//
返回视图:
onCreateView 方法返回 Inflated 的视图,完成 Fragment 的创建。
这段代码演示了如何在 Android Fragment 中集成列表和轮播图,以及如何使用适配器来管理 RecyclerView 的数据和展示。
以上就是我自己学习的RecycleView使用步骤,自己也是觉得很烂!希望大家能相互学习!
总结
以上就是我自己学习的RecycleView使用步骤,自己也是觉得很烂!希望大家能相互学习!