Android之RecyclerView显示数据列表和网格

news/2024/12/18 0:28:06/

一、RecyclerView的优势

RecyclerView 的最大优势在于,它对大型列表来说非常高效:

  • 默认情况下,RecyclerView 仅会处理或绘制当前显示在屏幕上的项。例如,如果您的列表包含一千个元素,但只有 10 个元素可见,那么 RecyclerView 仅会完成在屏幕上绘制这 10 个项的工作。当用户滚动时,RecyclerView 会确定应在屏幕上显示哪些新项,然后仅完成显示这些项的工作。
  • 当某个项滚动出屏幕时,RecyclerView 会回收其视图。也就是说,这个项中会填充滚动到屏幕上的新内容。RecyclerView 的这种行为可以节省大量处理时间,并能让列表顺畅地滚动。
  • 当某个项发生变化时,RecyclerView 无需重新绘制整个列表即可更新该项。在显示包含复杂项的长列表时,这可以极大地提高效率!

二、RecyclerView中显示数据的步骤

如需在 RecyclerView 中显示您的数据,您需要以下几个部分:

  • 要显示的数据。即列表项中要显示的内容。
  • 在布局文件中定义的一个 RecyclerView 实例,用作视图的容器。RecyclerView包含与您的数据对应的视图的 ViewGroup,它本身是一个视图,因此,将 RecyclerView 添加到布局中的方式与添加任何其他界面元素相同。
  • 一个数据项的布局。如果所有列表项看起来都一样,您可以对所有这些列表项使用相同的布局,但这不是强制性要求。项布局必须与 fragment 的布局分开创建,以便一次创建一个项视图,并在其中填充数据。
  • 一个布局管理器。布局管理器负责排列列表中的各个元素。您可以使用 RecyclerView 库提供的某个布局管理器,也可以定义自己的布局管理器。布局管理器均基于库的 LayoutManager 抽象类。
  • 一个 ViewHolder。该 ViewHolder 用于扩展 ViewHolder 类。它包含视图信息,用于显示项布局中的一项。ViewHolder 还会添加一些信息,供 RecyclerView 用于在屏幕上高效移动视图。可以通过扩展 RecyclerView.ViewHolder 来定义 ViewHolder。
  • 一个适配器。该适配器可将您的数据与 RecyclerView 相关联。它会调整数据,使其可在 ViewHolder 中显示。RecyclerView 会使用适配器确定如何在屏幕上显示数据。可以通过扩展 RecyclerView.Adapter 来定义 Adapter。

三、实现RecyclerView

1. 添加依赖项

在模块的 build.gradle 中添加 RecyclerView 的依赖项:

implementation("androidx.recyclerview:recyclerview:1.3.2")

2. 准备要显示的数据

本例只是演示 RecyclerView 的用法,故只简单显示颜色列表,数据项中只需定义一个 TextView 来显示颜色即可。实际项目中需根据需求定义相应的数据类来保存列表项内容。

val listData = arrayOf("yellow", "red", "blue")

3. 在 xml 中添加RecyclerView组件

布局 recyclerview_main.xml

<androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerview"android:layout_width="fill_parent"android:layout_height="wrap_content" />

4. 创建 列表项布局

本例中 RecyclerView 显示了一个简单的文本元素列表,每个视图项的布局在xml中定义,recyclerview_item.xml 布局如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="40dp"><TextViewandroid:id="@+id/tv_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/element_text"android:gravity="center_vertical"/></FrameLayout>

5. 选择布局管理器

RecyclerView 中的列表项由 LayoutManager 类负责排列。RecyclerView 库提供了三种布局管理器,用于处理最常见的布局情况:

  • LinearLayoutManager 将各个项排列在一维列表中。
  • GridLayoutManager 将项排列在二维网格中:
    • 如果网格垂直排列,GridLayoutManager 会尽量使每行中所有元素的宽度和高度相同,但不同的行可以有不同的高度。
      - 如果网格水平排列,GridLayoutManager 会尽量使每列中所有元素的宽度和高度相同,但不同的列可以有不同的宽度。
  • StaggeredGridLayoutManager 与 GridLayoutManager 类似,但不要求同一行中的表项具有相同的高度(垂直网格有此要求)或同一列中的列表项具有相同的宽度(水平网格有此要求)。其结果是,同一行或同一列中的列表项可能会错落不齐。

6. 实现ViewHolder和适配器Adapter

ViewHolder 是包含列表中各列表项的布局的 View 的封装容器。Adapter 会根据需要创建 ViewHolder 对象,还会为这些视图设置数据。将视图与其数据相关联的过程称为“绑定”。这两个类配合使用,共同定义数据的显示方式。

定义适配器时,您需要替换三个关键方法:

  • onCreateViewHolder():每当 RecyclerView 需要创建新的 ViewHolder 时,它都会调用此方法。此方法会创建并初始化 ViewHolder 及其关联的 View,但不会填充视图的内容,因为 ViewHolder 此时尚未绑定到具体数据。
  • onBindViewHolder():RecyclerView 调用此方法将 ViewHolder 与数据相关联。此方法会提取适当的数据,并使用该数据填充 ViewHolder 的布局。例如,如果 RecyclerView 显示的是一个名称列表,该方法可能会在列表中查找适当的名称,并填充 ViewHolder 的 TextView widget。
  • getItemCount():RecyclerView 调用此方法来获取数据集的大小。例如,在通讯簿应用中,这可能是地址总数。RecyclerView 使用此方法来确定什么时候没有更多的列表项可以显示。

下面是一个典型的简单 Adapter 示例,该 Adapter 包含一个显示数据列表的嵌套 ViewHolder。在本例中,RecyclerView 显示了一个简单的文本元素列表。系统会向 Adapter 传递一个字符串数组,该数组包含了 ViewHolder 元素的文本。

	package com.android.jetpack.recyclerviewimport android.view.LayoutInflaterimport android.view.Viewimport android.view.ViewGroupimport android.widget.TextViewimport androidx.recyclerview.widget.RecyclerViewimport com.android.jetpack.Rclass CustomAdapter(private val dataSet: Array<String>): RecyclerView.Adapter<CustomAdapter.ViewHolder>() {// 列表项视图容器class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {// 列表项内控件val textview: TextViewinit {textview = view.findViewById(R.id.tv_text)}}override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {val view = LayoutInflater.from(parent.context).inflate(R.layout.recyclerview_item, parent, false)return ViewHolder(view)}override fun getItemCount(): Int {return dataSet.size}override fun onBindViewHolder(holder: ViewHolder, position: Int) {holder.textview.text = dataSet[position]}}

7. 使用RecyclerView

在 RecyclerViewActivity 中使用 RecyclerView 的代码:

	package com.android.jetpack.recyclerviewimport android.os.Bundleimport android.os.PersistableBundleimport androidx.activity.ComponentActivityimport androidx.recyclerview.widget.LinearLayoutManagerimport com.android.jetpack.databinding.RecyclerviewMainBindingclass RecyclerViewActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {super.onCreate(savedInstanceState, persistentState)val binding = RecyclerviewMainBinding.inflate(layoutInflater)setContentView(binding.root)val listData = arrayOf("yellow", "red", "blue")val adapter = CustomAdapter(listData)binding.recyclerview.adapter = adapterbinding.recyclerview.layoutManager = LinearLayoutManager(this)}}

参考文档:

https://developer.android.google.cn/codelabs/kotlin-android-training-recyclerview-fundamentals
https://developer.android.google.cn/develop/ui/views/layout/recyclerview?hl=zh_cn


http://www.ppmy.cn/news/1555989.html

相关文章

JavaScript学习难点

一、语法的灵活性 动态类型&#xff1a; JavaScript 是一种动态类型语言&#xff0c;这意味着变量的类型可以在运行时改变。这与静态类型语言&#xff08;如 Java、C&#xff09;形成鲜明对比&#xff0c;在静态类型语言中&#xff0c;变量的类型在编译时就已经确定。 例如&am…

ChatGPT推出视频通话及屏幕理解功能,近屿智能邀您共探AI前沿技术

北京时间12月13日凌晨&#xff0c;OpenAI在第六天直播活动中宣布为 ChatGPT 的高级语音模式带来视频输入和屏幕理解功能&#xff0c;同时&#xff0c;为了迎接即将到来的圣诞节&#xff0c;OpenAI还限时推出了充满节日氛围的圣诞老人模式。 直播一开场&#xff0c;几位团队成员…

005 Qt常用控件Qwidget_下

文章目录 前言windowOpacity属性cursor属性font属性toolTip属性focuspolicy属性styleSheet属性 小结 前言 本文将会向你分享Qwidget的常见属性 windowOpacity属性 API说明windowOpacity()获取到控件的不透明数值. 返回 float, 取值为 0.0 -> 1.0 其中 0.0 表⽰全透明, 1.…

《深入理解 Java 中的 ImmutableList》

一、引言 在 Java 编程中&#xff0c;数据结构的选择对于程序的性能、可读性和可维护性至关重要。Java 中的ImmutableList是一种不可变的列表类型&#xff0c;它在很多场景下都有着独特的优势。本文将深入探讨 Java 中的ImmutableList&#xff0c;包括其概念、特点、用法以及与…

Jenkins 启动 程序 退出后 被杀死问题

参考 Spawning Processes From Build (jenkins.io) 解决jenkins脚本启动项目后进程被杀死_jenkins杀进程-CSDN博客

Uniapp跟原生android插件交互发信息(二)

一、背景 在uni-app开发过程中&#xff0c;有时候会遇到uni-app插件或者提供的api对硬件操作不太友好&#xff0c;需要使用原生Android开发 对应模块&#xff0c;为了使得双方通信方便&#xff0c;特意封装了一个接口&#xff0c;可实现Android与Uni-app互相通讯。 二、内容 …

Qt-对话框使用总结

参考文章链接: Qt对话框之一:标准对话框 Qt对话框之二:模态、非模态、半模态对话框 标准对话框 颜色对话框 颜色对话框类 QColorDialog 提供了一个可以获取指定颜色的对话框部件。 /*** 第一种方式 ***/ //QColor color = QColorDialog::getColor(Qt::red, this,…

实时日志与发展:Elasticsearch 推出全新专用的 logsdb 索引模式

作者&#xff1a;来自 Elastic Mark Settle, George Kobar 及 Amena Siddiqi Elastic 最新发布的 logsdb 索引模式是专为日志管理优化的功能&#xff0c;旨在提升日志数据的存储效率、查询性能以及整体可用性。这个模式专注于满足现代日志处理需求&#xff0c;提供更高效的日志…