完整的分步指南:如何在 Android 上使用 RecyclerView,包括示例和高级自定义

  • RecyclerView 是 Android 上列表和网格的现代标准,提供性能、灵活性和最大程度的定制。
  • 它的模块化架构允许您定义自定义布局、适配器、动画和元素类型,以适应任何应用程序的需求。
  • 它与其他 Jetpack 库和最佳实践的集成使得开发可扩展、响应迅速且视觉上引人注目的界面变得容易。

Android 上的 RecyclerView

如果您是一名 Android 开发人员,正在寻找一种高效、灵活的方式在您的应用中显示列表、网格或大量数据,那么 RecyclerView 就是您需要掌握的现代而强大的解决方案。 这款来自 Android Jetpack 库的多功能组件凭借其丰富的自定义选项、更佳的性能和模块化架构,已经取代了 ListView。本文将逐步讲解 RecyclerView 的使用方法,涵盖从初始设置到高级自定义技巧的全过程。

您将找到详细的解释、专业技巧以及 Kotlin 和 Java 的实用示例,以便您在项目中实现任何类型的列表或图库。本文面向 Android 开发新手以及希望优化界面并充分利用 RecyclerView 功能的用户。

RecyclerView 是什么?为什么它比其他替代品更受欢迎?

RecyclerView 生命周期

RecyclerView 是一个 Android 视图组件,它允许您以最少的资源消耗显示大型数据集。 由于它能够回收并重用屏幕上不再可见的视图,而无需每次创建新的视图。这优化了内存使用并提升了用户体验,即使包含数百或数千个元素,也能实现流畅的列表和网格。

与ListView相比,RecyclerView:

  • 将功能划分为可重复使用的小型组件 (适配器、ViewHolder、布局管理器、ItemAnimator、ItemDecoration)。
  • 允许对动画、装饰和物品类型进行更大程度的定制 (支持同一列表中具有不同布局和行为的项目)。
  • 包含新的 API 并与其他 Jetpack 和 Material Design 库更好地集成.
  • 支持推荐的架构模式 例如 ViewModel 和 LiveData,用于高效的生命周期和数据管理。

目前,RecyclerView 是 Google 推荐在 Android 应用程序中实现任何列表、图库、网格或轮播的选择。

组成 RecyclerView 的主要组件

要了解其工作原理,关键是要了解其组成组件及其在架构中的作用:

  • 回收站视图:是元素被渲染的容器ViewGroup。
  • 适配器:将数据连接到RecyclerView,创建ViewHolders,并将数据绑定到各个视图。
  • ViewHolder:封装每个元素的单独视图并存储对其组件的引用,以提高性能并避免重复调用 findViewById。
  • 布局管理器:控制元素在屏幕上的排列方式(线性、网格等)。
  • ItemAnimator:允许您为项目的插入、删除或更新等变化制作动画。
  • 物品装饰:方便在元素之间添加自定义分隔符、边距或装饰。

这种分离提供了灵活性并使代码更易于维护和扩展。

为什么要使用 RecyclerView?主要优点

使用 RecyclerView 为现代 Android 开发带来了以下关键优势:

  • 重用视图:系统回收屏幕外的视图而不是重新创建它们,从而优化内存和速度。
  • 设计灵活性:只需更改 LayoutManager,即可在垂直、水平、网格、Pinterest 样式列表等中显示项目。
  • 支持多种项目类型:通过实现各种类型的ViewHolder,可以在同一个列表中显示不同的布局(横幅、广告、产品、标题等)。
  • 原生动画和自定义动画:使用流畅的动画插入、删除或更新项目。
  • CardView 和 Material Design 支持:非常适合创建符合当前建议的视觉吸引力界面。
  • 与现代架构和 Jetpack Compose 更好地集成:促进 MVVM 等模式的采用及其与其他 Jetpack 组件的结合使用。

如何在 Android 项目中配置 RecyclerView

在开始使用 RecyclerView 之前,务必做好项目准备。你必须在 build.gradle (模块级别):

implementation 'androidx.recyclerview:recyclerview:1.4.0'
implementation 'androidx.cardview:cardview:1.0.0'

验证您使用的版本与您的 minSdk y 编译SDK有了这些依赖项,您将可以访问项目的所有 RecyclerView 和 CardView 组件。

如何在 XML 中声明 RecyclerView

在您想要显示列表的 Activity 或 Fragment 的 XML 中,像添加其他视图一样添加 RecyclerView 组件:

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

您可以根据您的设计自定义宽度、高度、填充和其他属性。

定义每个列表项的布局

每个元素的外观在单独的 XML 文件中定义 (例如, 商品.xml)。它可以像单个 TextView 一样简单,也可以像带有图像、按钮和其他小部件的 CardView 一样复杂。

使用 CardView 和 LinearLayout 的示例布局:

<androidx.cardview.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardElevation="4dp"
    card_view:cardCornerRadius="8dp"
    android:layout_margin="8dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="16dp">

        <TextView
            android:id="@+id/textNombre"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Nombre del producto"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/textDescripcion"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Descripción breve" />

    </LinearLayout>

</androidx.cardview.widget.CardView>

通过添加更多视图、图像或按钮,此设计可以适应任何需求。

创建 ViewHolder:优化和模块化

ViewHolder 是一个 维护对每个元素的可视组件的引用,避免在视图树中重复搜索,提高性能。

Kotlin 示例:

class ProductoViewHolder(view: View): RecyclerView.ViewHolder(view) {
    val nombre: TextView = view.findViewById(R.id.textNombre)
    val descripcion: TextView = view.findViewById(R.id.textDescripcion)
}

在现代版本中,使用 视图绑定 o 数据绑定 以实现更高的安全性和更轻松的视图访问。

创建适配器:数据和视图之间的桥梁

Adapter 是 RecyclerView 的核心其功能是创建并初始化ViewHolders,并将各个数据元素链接到列表中的相应位置。

class ProductosAdapter(private val lista: List<Producto>): RecyclerView.Adapter<ProductoViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProductoViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_producto, parent, false)
        return ProductoViewHolder(view)
    }

    override fun getItemCount(): Int = lista.size

    override fun onBindViewHolder(holder: ProductoViewHolder, position: Int) {
        val producto = lista[position]
        holder.nombre.text = producto.nombre
        holder.descripcion.text = producto.descripcion
    }
}

您应该始终实施的三种方法是:

  • onCreateViewHolder:创建并扩大每个项目的布局。
  • onBindViewHolder:将数据绑定到ViewHolder中的视图。
  • 获取项目计数:指示 RecyclerView 将显示多少个项目。

在 Activity 或 Fragment 中配置并初始化 RecyclerView

定义布局、适配器和 ViewHolder 后,必须在 Kotlin 或 Java 代码中配置 RecyclerView,通常在方法中 的onCreate 来自活动:

val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this) // Puedes cambiar por GridLayoutManager
recyclerView.adapter = ProductosAdapter(listaDeProductos)

El 布局管理器 定义元素的排列至关重要:

  • LinearLayoutManager:垂直或水平列表。
  • 网格布局管理器:列/行网格。
  • 交错网格布局管理器:类似 Pinterest 的网格(不同大小的元素)。

您可以根据用户操作或应用程序配置在运行时更改 LayoutManager。

捕获元素上的事件和交互

检测元素的点击对于创建交互式列表至关重要。有两种常用方法:

  1. 从适配器:直接在方法中分配监听器 onBindViewHolder (不太推荐,因为它将接口逻辑与适配器耦合)。
  2. 通过接口和回调:创建一个接口来通知点击事件,并将其从 Activity/Fragment 传递给 Adapter。这是最灵活且可扩展的方式。

Kotlin 中的接口示例:

interface OnProductoClickListener {
    fun onProductoClick(producto: Producto)
}

然后,您可以将此接口的实例传递给适配器,并在发生点击时调用它。

RecyclerView中的高级自定义技术

RecyclerView 的设计高度可定制。一些高级选项包括:

  • 处理多种元素类型:实现多个布局和 ViewHolder,在同一个列表中混合横幅、广告、产品和其他类型(使用方法 获取ItemViewType()).
  • 个性化装饰品: 使用 物品装饰 在项目之间添加分隔线、边距、图形分隔符或背景。
  • 动画:使用以下方式自定义插入、删除或更新项目时的动画 ItemAnimator 或整合 DiffUtil 通过动画实现高效的改变。
  • 无限滚动和渐进加载:实现滚动监听器,以便在到达列表末尾时加载更多数据。
  • 拖放:允许您使用交互式用户界面轻松地重新排列列表项。
  • 滑动操作:方便使用左/右拖动手势来删除、存档或检查项目。

每个元素都必须使用 CardView 吗?

不。虽然结合 RecyclerView 与 CardView 为了遵循 Material Design 指南,您可以使用任何类型的容器:LinearLayout、ConstraintLayout、FrameLayout,甚至自定义布局。

重要的是定义一个 XML 文件,使其与列表中每个项目的外观和行为相匹配。

RecyclerView 新闻和兼容性

最新版本增加了重要的改进:

  • 复杂动画中的优化.
  • 自适应刷新率支持 用于现代设备上的流体列表。
  • 与 Jetpack Compose 和其他 AndroidX 库具有更好的互操作性.
  • 扩展对 ViewPager2 的支持 以及其他分页视图。

RecyclerView 持续更新,兼容多种 Android 版本,适合新项目和现有应用的迁移。

RecyclerView 最常见的用例

可能性几乎无穷无尽。以下是一些常见的使用示例:

  • 联系人列表、消息或聊天。
  • 在线商店中的产品网格。
  • 图片或视频库。
  • 新闻列表、博客或动态帖子。
  • 多媒体小部件、音频/视频播放器、播放列表。
  • 自定义部分,如促销横幅、菜单、日历等。
  • 动态表单或分步向导。

你甚至可以嵌套多个RecyclerView或者将它们与其他组件组合来创建高度复杂和丰富的界面。

使用 RecyclerView 的最佳实践和建议

使用 RecyclerView 设计和安排列表时,请考虑以下提示:

  • 使用 视图绑定 o 数据绑定 以避免错误并简化对视图的访问。
  • 仅使用必要的物品进行升级 DiffUtil 或适配器通知方法(notifyItemChanged、notifyItemInserted 等)。
  • 避免在 onBindViewHolder提前准备好数据。
  • 对于具有多种元素类型的列表,实现 获取ItemViewType() 以实现高效回收。
  • 使用 Glide 或 Picasso 等库和异步加载来优化图像,尤其是媒体播放列表中的图像。
  • 仅当动画和自定义选项能为用户体验增加价值时才利用它们。
  • 考虑可访问性和可用性:确保元素可导航、具有充分的描述并且对交互做出良好的响应。

RecyclerView 高级选项和鲜为人知的细节

当你掌握 RecyclerView 时,你可以探索高级功能和模式:

  • 适配器代表: 通过委托创建和将每种类型链接到不同类别的责任,方便管理多种项目类型。
  • 与 LiveData 和 ViewModel 的集成: 允许在数据发生变化时自动刷新列表,方便 MVVM 架构中的被动管理。
  • 高效分页: 与 Paging 库一起,您可以显示从数据库或远程 API 逐步加载的无限列表。
  • 与 SwipeRefreshLayout 集成: 增加了使用向下滑动手势重新加载列表的支持。
  • 测试: RecyclerView 具有用于 UI 测试的特定实用程序,有助于在开发过程中实现列表的自动化并验证其是否正常运行。

有关 RecyclerView 的其他资源、提示和有用链接

为了进一步扩展您的知识或查看具体示例,您可以查看以下资源:

掌握 RecyclerView 是高质量 Android 开发的重要支柱之一。 从基本列表到复杂的多媒体网格,该组件允许您创建适合任何需求的现代、流畅的界面,始终优化设备资源并提供最佳的用户体验。

请随意尝试、自定义和重复使用这里介绍的模式,将您的 Android 应用提升到新的水平。