当前位置: 首页 > 知识库问答 >
问题:

为什么recyclerview比listview快[duplicate]

金珂
2023-03-14

我读到了关于b/w recyclerview和listview的区别,发现RecyclerViewer比listview更快。

我尝试在线搜索,但没有找到任何令人满意的答案,我知道它使用了ViewHolder模式和通知适配器,但它的内在功能是什么,所以它更快?

共有3个答案

司空朝
2023-03-14

因为ViewHolder模式。

这是最简单的答案。现在来看一些细节。

回收器视图所做的就是它的名字所表示的“回收”,是的,它回收项目,并且它是在< code > viewmoder 模式的帮助下完成的。

通过使用ViewHolder,我们不需要在每次遍历< code>getView()方法时都调用< code>findViewByID()。所有行的引用都存储在内存中。这显著提高了性能,因为< code>findViewByID()是一个繁重的进程。

希望这能消除你的困惑。

伏欣悦
2023-03-14

可以说,回收器视图是创建视图列表的有效方法。

如果您有1000个项目,如您的联系人列表,并且如果您的可视屏幕一次只能显示10个项目,则它将仅创建10个1(或2)视图,当您滚动时,左侧的项目/视图将被重用(而不是创建)以显示新数据。

默认情况下Recycler View执行此操作,而默认情况下List View不执行此操作。

邴兴为
2023-03-14

这两种观点之间存在一些差异。

ListView有点重,责任很多。每当我们必须处理列表时,比如以某种方式配置它,唯一的方法就是通过ListViewhtml" target="_blank">对象或在适配器中。

ListView中的许多不好的东西在RecycleView中被修复或更改。默认情况下它更有效率,布局是分开的,我们对适配器内的数据集有更多的可能性。

ListView和RecyclerView之间有一些关键区别:

1 个视图

ViewHolder 模式允许我们使列表滚动平稳运行。它存储列表行视图引用,因此,调用 findViewById() 方法只发生几次,而不是针对整个数据集和每个绑定视图。

RecyclerView 的适配器迫使我们使用 ViewHolder 模式。创建部分(膨胀布局和查找视图)和更新视图分为两种方法 - onCreateViewHolder()和onBindViewHolder()。

另一方面,ListView在默认情况下没有给我们这种保护,所以如果没有在getView()方法中实现ViewHolder模式,我们将会以低效的列表滚动结束。

2布局管理器

LayoutManager负责布局行视图。多亏了这一点,回收人员视图不必考虑如何定位行视图。这个类让我们有机会选择我们想要显示行视图的方式以及如何滚动列表。例如,如果我们想垂直或水平滚动列表,我们可以选择LinearLayoutManager。对于网格,选择GridLayoutManager更合适。

以前,使用ListView,我们只能创建一个垂直滚动的列表,所以不够灵活。如果我们想在列表中显示网格,我们必须选择另一个小部件——GridView。

3项目装饰

ItemDecoration的职责在理论上很简单——为列表行视图添加一些装饰——但在实践中,如果我们想要创建自定义装饰,实现起来就这么简单。在这种情况下,我们应该扩展ItemDecoration类并实现我们的解决方案。例如,默认情况下,RecyclerView列表在行之间没有分隔符,并且与材质设计准则一致。然而,如果出于某种原因我们想添加一个除法器,我们可以使用DividerItemDecoration并将其添加到RecyclerView。如果我们使用ListView,我们必须自己找出行。对于这个小部件,没有类似ItemDecoration的助手类。

4 项动画器

我想提到的RecyclerView的最后一个组件是ItemAnimator。正如我们所料,它处理行视图动画,比如列表的出现和消失,添加或删除特定的视图等等。默认情况下,RecyclerView的列表动画非常漂亮流畅。当然,我们可以通过创建自己的ItemAnimator来改变这一点,这也不是那么容易。为了使它更容易,我们应该扩展SimpleItemAnimator类并实现我们需要的方法(只需向视图持有者的视图添加动画)。老实说,在ListView上实现动画是一件痛苦的事情。同样,我们必须弄清楚我们想要如何处理它们。

5 通知适配器

我们在RecyclerView的适配器上有几个很酷的通知程序。我们仍然可以使用notifyDataSetChanged(),但是也有一些用于特定列表元素的方法,比如notifyItemInserted()、notifyItemRemoved()甚至notifyItemChanged()等等。我们应该根据实际发生的情况使用最合适的动画,这样合适的动画才能正确地启动。

使用ListView,我们能够在适配器上只使用通知数据设置更改(),然后必须再次自己处理其余部分。

 类似资料:
  • 从Android API22正式开始,被添加到中。许多人说它是对的一种增强,并且在Internet上发布了许多关于它用法的简要介绍。但这些文章大多非常简单、浅薄、空洞。增强仅仅是、还是?滚动期间项目视图的与不同吗?与相比,的究竟是什么? 任何答案,提示或链接都很感谢。提前道谢。

  • 问题内容: 示例代码在这里 问题答案: 我认为速度更快,因为使用矢量化方式和熊猫构建在此数组上。 慢,因为它使用。 操作是最快的,然后是。 请参阅此答案,并更好地解释pandas开发人员。

  • 问题内容: 我不知道为什么numba在这里击败numpy(超过3倍)。我在这里进行基准测试时是否犯了一些根本性的错误?对于numpy来说似乎是完美的情况,不是吗?请注意,作为检查,我还运行了一个结合了numba和numpy的变体(未显示),正如预期的那样,它与不带numba的numpy运行相同。 (顺便说一下,这是一个后续问题:数字处理二维数组的最快方法:dataframe vs series v

  • 为什么到现在LV还没有被弃用或者至少提到RV应该出于性能的原因使用呢?我从来没有使用过RecyclerView,但是它是否复杂得多,以至于有两个视图做本质上相同的事情是值得的?或者也许另有原因?

  • 我正在将RecolyerView的xml项从LinearLayout更改为ConstraintLayout。当我水平滚动recyclerView时,它会滞后,并且呈现速度比LinearLayout慢得多。 约束布局 线性布局

  • 问题内容: 我有一个问题,我需要查找具有与值匹配的度量 或 根本没有该度量的记录。我使用s,using和using三种或四种不同的方法解决了该问题。但是,每次查询最终都变得非常慢。然后,我尝试将查询一分为二,它们都非常快地运行(三秒钟)。但是使用组合查询需要花费超过五分钟的时间。 在SO上阅读,我尝试了,速度非常快,但是对于我正在使用的脚本非常不便。 有两个问题: 为什么这么快?(或者为什么这么慢