RecyclerView 如何在 Android 内部工作?
RecyclerView 是作为 GridView 和 ListView 的继承者添加到 android studio 中的 ViewGroup。这是对两者的改进,可以在最新的 v-7 支持包中找到。它的创建是为了可以将任何具有 XML 布局的列表构建为可以大量定制的项目,同时提高 ListViews 和 GridViews 的效率。这种改进是通过回收用户不可见的视图来实现的。例如,如果用户向下滚动到项目 4 和 5 可见的位置;项目 1、2 和 3 将从内存中清除以减少内存消耗。在开发 Android 应用程序时,我们很有可能需要使用 RecyclerView。在本文中,我们将了解 RecyclerView 在 Android 操作系统中的工作原理。我们会谈论它。
- RecyclerView 到底是什么?
- RecyclerView 组件
- 它实际上是如何工作的?
- 为什么 RecyclerView 中使用 ViewHolder?
RecyclerView 到底是什么?
RecyclerView 是一个 ViewGroup,它根据 ViewHolder 提供的数据集合填充列表并将其显示给屏幕上的用户。你可以参考这篇文章 RecyclerView in Android with Example
RecyclerView 组件
RecyclerView 的主要组件是,
- 适配器\ViewHolder\
- 布局管理器\适配器
- 它是一个 RecyclerView 子类型。
适配器是一个类。它获取需要在 RecyclerView 中显示给用户的数据集。它充当绑定视图和显示它们的主要负责类。大部分工作是在 RecyclerView 的适配器类中完成的。
- ViewHolder:ViewHolder 是一种帮助类,它允许我们为屏幕上的各个项目绘制 UI。
- LayoutManager:recyclerView 中的LayoutManager帮助我们确定如何在屏幕上显示项目。它可以线性或在网格中完成。 RecyclerView 默认带有一些 layoutManager 实现。
它充当 RecyclerView 的管理机构,通知 RecyclerView 的适配器何时创建新视图。
它实际上是如何工作的?
那么,让我们来看看 recyclerView 是如何工作的。当人们谈论 recyclerView 时,他们总是说它回收视图。但这究竟是什么意思?所以,假设我们正在滚动一个包含 50 个项目的列表,我们一次只显示其中的 5 个,如
项目 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 在内部和有效地运作的方式。