Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么recyclerview比listview快_Android_Android Recyclerview_Android Listview - Fatal编程技术网

Android 为什么recyclerview比listview快

Android 为什么recyclerview比listview快,android,android-recyclerview,android-listview,Android,Android Recyclerview,Android Listview,我读到了recyclerview和listview的区别,发现recyclerview比listview快 我尝试在线搜索,但没有找到任何满意的答案。我知道它使用了ViewHolder模式和Notifying adapter,但它在内部做了什么,所以速度更快?您可以说,回收器视图是创建视图列表的有效方法 如果您有1000个项目,比如您的联系人列表,并且如果您的可视屏幕一次只能显示10个项目,那么它将只创建10+1或+2个视图,并且当您滚动时,剩余的项目/视图将被重用,而不会显示新数据 默认情况下

我读到了recyclerview和listview的区别,发现recyclerview比listview快


我尝试在线搜索,但没有找到任何满意的答案。我知道它使用了ViewHolder模式和Notifying adapter,但它在内部做了什么,所以速度更快?

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

如果您有1000个项目,比如您的联系人列表,并且如果您的可视屏幕一次只能显示10个项目,那么它将只创建10+1或+2个视图,并且当您滚动时,剩余的项目/视图将被重用,而不会显示新数据

默认情况下,Recycler视图执行此操作,而默认情况下as列表视图不执行此操作

因为视窗夹图案

这是最简单的答案。现在了解一些细节

recycler视图所做的是它的名称表示回收,是的,它回收项目,并在ViewHolder模式的帮助下完成

通过使用ViewHolder,我们不需要在每次使用getViewmethod时调用findViewByID。所有行的引用都存储在内存中。这大大提高了性能,因为FindViewByDis是一个繁重的过程


希望这能消除你的困惑。

这两种观点之间有些不同

ListView有点重,它有很多责任。无论何时我们必须处理列表,例如以某种方式配置它,唯一的方法就是通过ListView对象或在适配器内部进行处理

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

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

1名观众

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

RecyclerView的适配器强制我们使用ViewHolder模式。创建零件膨胀布局和查找视图并更新视图分为两种方法-onCreateViewHolder和onBindViewHolder

另一方面,ListView在默认情况下不提供这种保护,因此如果不在getView方法中实现ViewHolder模式,我们将以列表中低效的滚动结束

2布局经理

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

以前,使用ListView时,我们只能创建一个垂直滚动列表,所以它并没有那个么灵活。如果我们想要列表中的网格,我们必须为它选择另一个小部件——GridView

3项装饰

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

4项动画师

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

5通知适配器

我们在RecyclerView的适配器上有几个很酷的通知程序。我们仍然可以使用notifyDataSetChanged,但也有一些用于特定列表元素,如notifyItemInserted、notifyItemRemoved甚至notifyItemChanged等。我们应该对实际发生的事情使用最合适的方法,因此 动画将正确发射


使用ListView,我们可以在适配器上使用notifyDataSetChanged,然后必须自己处理其余部分。

检查此链接:该链接是RecyclerView在ListView上提供的内容的一个很好的总结。但是从性能的角度来看,RecyclerView只允许开发人员比ListView少犯影响性能的错误,因为它使我们使用ListView的许多样板文件正式化,以使其快速高效,例如ViewHolder模式。我发现您的code@user1241241哪种代码?