ChatGPT解决这个技术问题 Extra ChatGPT

Android Recyclerview vs ListView with Viewholder

我最近遇到了 Android 5.0 发布的 android RecyclerView,似乎 RecyclerView 只是一个封装的传统 ListView,其中包含 ViewHolder 模式,它促进了视图的重用,而不是创建它每一次。

使用 RecyclerView 的其他好处是什么?如果两者在性能方面具有相同的效果,为什么更喜欢 RecyclerView ?

编辑

我发现有人问过类似的问题,但答案都不是结论性的,在这里添加它们以备记录。

Recyclerview vs Listview

Should we use RecyclerView to replace ListView?

Why doesn't RecyclerView have onItemClickListener()? and How RecyclerView is different from Listview?

因为 RecyclerView 速度更快,功能更丰富,API 更好。 RecyclerView 中已经实现了诸如动画添加或删除项目之类的功能,您无需执行任何操作。毫无疑问,把你的 ListView 扔进垃圾桶,RecyclerView 就是来抢戏的。
您可以将布局管理器与 RecyclerView 相关联,因此它们不限于垂直滚动列表。这是非常强大的附加功能。
@Alan - “不限于垂直滚动列表”是什么意思?您是说回收视图也可以充当 Gridviews 和 ListViews 的“占位符”吗?
@XaverKapeller - 如果您能列出两者之间的差异并回答问题而不是发表评论,那就太好了,这样它可能会帮助我和将来可能对同一件事感到疑惑的其他人?
@Alan-您能否提供一些有关您的意思的详细信息并回答问题而不是发表评论。感谢您抽出宝贵的时间

R
Ravindra Kushwaha

使用 RecycleView 的另一个好处是动画,它可以在两行代码中完成

RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator();
        recyclerView.setItemAnimator(itemAnimator);

但小部件仍然是原始的,例如您不能创建页眉和页脚。


从这个意义上说,您永远无法创建页眉和页脚。它们只是适配器中的其他视图类型。列表视图将您的适配器包装在 HeaderViewListAdapter 中并在后台添加标题支持。有了 RecyclerView,您就可以掌控一切。
RecyclerView 默认使用 DefaultItemAnimator。那你为什么用这个代码?
M
Mushtaq Jameel

好吧,稍微挖掘了一下,我在 RecycleView 上从 Bill Philips article 那里找到了这些宝石

RecyclerView 可以做的比 ListView 更多,但是 RecyclerView 类本身的职责比 ListView 少。开箱即用,RecyclerView 没有: 在屏幕上定位项目 动画视图 处理除滚动之外的任何触摸事件 所有这些东西都被烘焙到 ListView 中,但是 RecyclerView 使用协作者类来代替这些工作。您创建的 ViewHolders 也更强大。它们是 RecyclerView.ViewHolder 的子类,它有一堆 RecyclerView 使用的方法。 ViewHolders 知道他们当前绑定到哪个位置,以及哪些项目 ID(如果有的话)。在这个过程中,ViewHolder 被封为爵士。过去,ListView 的工作是保留整个项目视图,而 ViewHolder 只保留其中的一小部分。现在,ViewHolder 在 ViewHolder.itemView 字段中保留了所有内容,该字段在 ViewHolder 的构造函数中为您分配。


C
Community

更多来自 Bill Phillip's 文章(去阅读吧!),但我认为指出以下内容很重要。

在 ListView 中,关于如何处理点击事件存在一些歧义:应该由单个视图处理这些事件,还是 ListView 应该通过 OnItemClickListener 处理它们?但是,在 RecyclerView 中,ViewHolder 处于一个明确的位置,可以充当处理这些细节的行级控制器对象。我们之前看到 LayoutManager 处理定位视图,而 ItemAnimator 处理它们的动画。 ViewHolder 是最后一块:它负责处理 RecyclerView 显示的特定项目上发生的任何事件。


R
Ravindra Kushwaha

我使用带有 Glide 图像加载器的 ListView,内存增长。然后我将 ListView 替换为 RecyclerView。它不仅编码更困难,而且比ListView占用更多的内存。至少,在我的项目中。

在另一个活动中,我使用了带有 EditText's 的复杂列表。在其中一些中,输入法可能会有所不同,也可以应用 TextWatcher。如果我使用 ViewHolder,如何在滚动过程中替换 TextWatcher?因此,我使用了没有 ViewHolderListView,它可以工作。


我使用了没有 ViewHolder 的 ListView,它可以工作。糟糕的主意......我怎么能在滚动期间替换 TextWatcher?不需要替换它......只是TextWacher应该在重用后将数据放入不同的容器......并且它可以很容易地完成
@Selvin,感谢您的意见。现在我无法编辑该项目。屏幕上有几个TextWatcher。可能你是对的,但我无法检查出来。
F
Federico Navarrete

在向上/向下滚动时重用单元格 - 这可以通过在 listView 适配器中实现 View Holder 来实现,但它是可选的,而在 RecycleView 中它是编写适配器的默认方式。

将列表与其容器分离 - 因此您可以在运行时通过设置 LayoutManager 轻松地将列表项放入不同的容器(linearLayout、gridLayout)中。

例子:

mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3));

动画常见的列表动作。

动画被解耦并委托给 ItemAnimator。

RecyclerView还有很多,但我认为这几点是主要的。

布局管理器

i) LinearLayoutManager - 支持垂直和水平列表,

ii) StaggeredLayoutManager - 支持 Pinterest 之类的交错列表,

iii) GridLayoutManager - 支持在 Gallery 应用程序中显示网格。

最好的事情是我们可以根据需要动态地完成所有这些工作。


f
farzin borujerdi

RecyclerView 是作为 ListView 改进创建的,所以是的,您可以使用 ListView 控件创建附加列表,但使用 RecyclerView 更容易,因为它:

在向上/向下滚动时重用单元格:这可以通过在 ListView 适配器中实现 View Holder 来实现,但它是可选的,而在 RecycleView 中它是编写适配器的默认方式。将列表与其容器分离:因此您可以在运行时通过设置 LayoutManager 轻松地将列表项放入不同的容器(linearLayout、gridLayout)中。

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));

动画常见列表动作:动画被解耦并委托给 ItemAnimator。 RecyclerView还有很多,但我认为这几点是主要的。

因此,总而言之,RecyclerView 是一种更灵活的控件,用于处理“列表数据”,它遵循关注委托的模式,并且只为自己留下一个任务——回收项目。


M
Mahbubur Rahman Khan

如果您使用 RecycleView,首先您需要更多的设置工作。你需要花更多的时间来设置简单的Item onclick、边框、触摸事件和其他简单的东西。但最终产品将是完美的。

所以决定权在你。我建议,如果您设计像电话簿加载这样的简单应用程序,只需单击项目就足够了,您可以实现列表视图。但是,如果您设计像社交媒体主页那样无限滚动。项目之间有几种不同的装饰,对单个项目的控制比使用回收视图要多。