实战 | 认识 RecyclerView - 飞外
发布时间: 2023-07-06

RecyclerView 是一款非常强大的 widget,它可以帮助您灵活地显示列表数据。当我开始学习 RecyclerView 的时候,我发现对于复杂的列表界面有很多资源可以参考,但是对于简单的列表展现就鲜有可参考的资源了。虽然 RecyclerView 的组成结构乍一看有些复杂,但是深入理解以后您会发现它其实非常简单明了。

本文会通过创建一个简单的 RecyclerView 实现一个列表来显示不同种类的花的名字。在实现的过程中,我也会将 RecyclerView 的每个部分揉碎了展现给大家,这样大家就可以在自己的应用中实现了。

RecyclerView 是 "何方神圣"?为什么选择它呢?

RecyclerView 是一个容器,它用于显示列表形式 (list) 或者网格形式 (grid) 的数据,比如文本或者照片。

当列表滑动的时候,实际上只有少量邻近的视图会显示在屏幕上。当视图滑出屏幕时,RecyclerView 会复用它并且填充新的数据。由于它是通过回收已有的结构而不是持续创建新的列表项,所以它可以有效提高应用的时间效率和空间效率。

粉红色的方格表示屏幕上正在显示的表项,黄色的方格表示屏幕可视范围之外的表项是如何被回收并转为新的视图

为什么您需要使用 RecyclerView 呢?

  • RecyclerView 使用 ViewHolder 模式,这样做可以提高性能,因为它无需频繁调用 findViewById() 方法即可访问表项的视图;
  • RecyclerView 使用 LayoutManager,它支持纵向滑动的列表和横向滑动的列表,以及交错布局的列表和网格布局的列表。您还可以创建自定义的 LayoutManager;
  • RecyclerView 提供默认的表项动画以及自定义动画的入口。

    总之,RecyclerView 兼顾了灵活性和个性化,所以它是功能强大的工具。

    实现 RecyclerView

    本文会为大家展示如何实现一个简单的 RecyclerView,用它来显示不同种类花的名称。下面的代码会使用 Kotlin 语言,但是 RecyclerView 也可以在 Java 语言中使用。

    首先在 Android Studio 里创建一个工程,并且使用 Empty Activity 模板。设置项目名称,并且选择 Kotlin 作为项目所用的语言。

    接下来在 app 级的 build.gradle 文件里引入 最新版本 的 RecyclerView 依赖。

     2019 Google LLC.    SPDX-License-Identifier: Apache-2.0 -->// 在 https://developer.android.google.cn/jetpack/androidx/releases/recyclerview 获得最新版本号def recyclerview_version = "1.1.0"implementation 'androidx.recyclerview:recyclerview:$$recyclerview_version
    RecyclerView 数据

    RecyclerView 最重要的组成部分之一就是需要显示的数据。对于比较复杂的应用来说,数据可能是来自数据库或者来自于网络,不过这里我们简单使用字符串资源文件作为应用的数据源。

    strings.xml 文件中,创建一个字符串数组来存放花的名称。

    <!-- Copyright 2019 Google LLC.    SPDX-License-Identifier: Apache-2.0 --><resources>    <string name="app_name">RecyclerSample</string>    <string-array name="flower_array">        <item>Lily</item>        <item>Poppy</item>        <item>Sunflower</item>        <item>Freesia</item>        <item>Daisy</item>        <item>Rose</item>        <item>Daffodil</item>        <item>Lavender</item>        <item>Peony</item>        <item>Lilac</item>        <item>Dahlia</item>        <item>Tulip</item>        <item>Dandelion</item>        <item>Geranium</item>        <item>Gardenia</item>        <item>Rhododendron</item>        <item>Azalea</item>    </string-array></resources>

    然后,创建一个类,名字为 Datasource,并且可以接收一个 Context 类型的参数。创建一个叫做 getFlowerList() 的函数,它负责返回花的名称列表。

    <!-- Copyright 2019 Google LLC.    SPDX-License-Identifier: Apache-2.0 -->class Datasource(val context: Context) {    fun getFlowerList(): Array<String> {        return context.resources.getStringArray(R.array.flower_array)    }}

    MainActivity.onCreate() 中,创建一个变量叫做 flowerList,然后将 getFlowerList() 的返回结果赋给它。

    <!-- Copyright 2019 Google LLC.    SPDX-License-Identifier: Apache-2.0 -->override fun onCreate(savedInstanceState: Bundle?) {  super.onCreate(savedInstanceState)  setContentView(R.layout.activity_main)  val flowerList = Datasource(this).getFlowerList()}
    RecyclerView 布局

    接下来,在 activity_main 布局文件中将 TextView 替换为 RecyclerView,并且将其 layoutManager 设置为 LinearLayoutManager。使用 LinearLayoutManager 意味着未来数据将以纵向列表或者横向列表的形式显示 (默认是纵向列表)。

    <!-- Copyright 2019 Google LLC.    SPDX-License-Identifier: Apache-2.0 --><FrameLayout xmlns:andr
  • 微信