📜  RecyclerView 如何在 Android 内部工作?

📅  最后修改于: 2022-05-13 01:58:44.580000             🧑  作者: Mango

RecyclerView 如何在 Android 内部工作?

RecyclerView 是作为 GridView 和 ListView 的继承者添加到 android studio 中的 ViewGroup。这是对两者的改进,可以在最新的 v-7 支持包中找到。它的创建是为了可以将任何具有 XML 布局的列表构建为可以大量定制的项目,同时提高 ListViews 和 GridViews 的效率。这种改进是通过回收用户不可见的视图来实现的。例如,如果用户向下滚动到项目 4 和 5 可见的位置;项目 1、2 和 3 将从内存中清除以减少内存消耗。在开发 Android 应用程序时,我们很有可能需要使用 RecyclerView。在本文中,我们将了解 RecyclerView 在 Android 操作系统中的工作原理。我们会谈论它。

  1. RecyclerView 到底是什么?
  2. RecyclerView 组件
  3. 它实际上是如何工作的?
  4. 为什么 RecyclerView 中使用 ViewHolder?

RecyclerView 到底是什么?

RecyclerView 是一个 ViewGroup,它根据 ViewHolder 提供的数据集合填充列表并将其显示给屏幕上的用户。你可以参考这篇文章 RecyclerView in Android with Example

RecyclerView 组件

RecyclerView 的主要组件是,

  1. 适配器\ViewHolder\
  2. 布局管理器\适配器
  3. 它是一个 RecyclerView 子类型。

适配器是一个类。它获取需要在 RecyclerView 中显示给用户的数据集。它充当绑定视图和显示它们的主要负责类。大部分工作是在 RecyclerView 的适配器类中完成的。

  • ViewHolder:ViewHolder 是一种帮助类,它允许我们为屏幕上的各个项目绘制 UI。
  • LayoutManager:recyclerView 中的LayoutManager帮助我们确定如何在屏幕上显示项目。它可以线性或在网格中完成。 RecyclerView 默认带有一些 layoutManager 实现。

它充当 RecyclerView 的管理机构,通知 RecyclerView 的适配器何时创建新视图。

它实际上是如何工作的?

那么,让我们来看看 recyclerView 是如何工作的。当人们谈论 recyclerView 时,他们总是说它回收视图。但这究竟是什么意思?所以,假设我们正在滚动一个包含 50 个项目的列表,我们一次只显示其中的 5 个,如

Android 中的 RecyclerView

图 1:回收站视图。

项目 1 到 5 是在屏幕上可见的项目。当我们向上滚动时,项目 x 将是屏幕上接下来出现的项目。此列表中的每个项目都是独一无二的并且是传统的!

那么,回收是如何工作的呢?

让我们一步一步来。

  • 步骤#1:在初始启动时,第一个项目 x 到 4 必须显示在屏幕上。所以这些是在视图模式下可见的五个项目。让我们将它们称为可见视图。而且,当列表向上滚动时,第 5 项是要加载的新项。
  • 步骤#2:当我们向上滚动一个项目时,项目 x 向上移动,一个新项目项目 5 进入可见视图类别。第 6 项现在处于等待模式。项目 x 已移出屏幕顶部的可见视图。这称为报废视图。
  • 第 3 步:假设我们又向上滚动了一步。这将从屏幕中删除项目 1 并允许项目 6 进入。在这种情况下,项目 1 也被报废。我们现在有两个已删除的视图,项目 x 和项目 1。它们现在将保存在报废的视图集合中。因此,当我们需要在可见视图组中加载新视图时,请考虑第 7 项,使用废弃视图集合中的视图。
  • 第 4 步:当我们加载项目 7 时,我们现在从废弃视图集合中选择一个视图。我们从废弃视图加载的视图称为脏视图。这就是recyclerView中视图回收的方式,这也是RecyclerView性能提升的主要原因之一。在此过程中重用项目的视图以在屏幕上绘制新项目。

为什么 RecyclerView 中使用 ViewHolder?

RecyclerView 中的 ViewHolders 有助于以另一种方式优化视图。因此,假设我们在列表中有 100 个项目,并且想要在屏幕上显示其中的 5 个。此列表中的每一项都有一个 TextView 和一个 ImageView。因此,使用 findViewById 映射每个视图总是一项昂贵的任务,想象一下我们需要多少个 findViewById 来映射 100 个项目的所有 TextView 和 ImageView,即 200 个 findViewById。因此,当我们使用 RecyclerView 时,一开始只创建了六个项目,其中一次加载了五个以显示在屏幕上,一个要加载。如果我们向下滚动列表,我们现在有 7 个 ViewHolders。一个用于报废视图,一个用于要加载的视图,五个用于显示的视图。 b因此,我们一次只能使用 14 个 findViewById,因为我们最多有 7 个 ViewHolder。

结论

ViewHolders 和视图回收提高了 RecyclerViews 的性能。同样,如果我们有多种视图类型,比如 ViewType1 和 ViewType2,我们将拥有两个不同的 ViewType1 和 ViewType2 类型的废弃视图集合。并且,当视图被回收时,ViewType1 视图将仅分配给 ViewType1 视图,而 ViewType2 视图将分配给 ViewType2 视图。这就是 recyclerView 在内部和有效地运作的方式。