我们应该使用RecyclerView替换ListView吗?


232

Android文档说:

RecyclerView小部件是ListView的更高级,更灵活的版本。该小部件是一个用于显示大型数据集的容器,可以通过维护有限数量的视图来非常高效地滚动该数据集。当您有数据收集,其元素在运行时根据用户操作或网络事件而更改时,请使用RecyclerView小部件

ListView如果效率无关紧要,实际上可以完成上述所有操作,并且当我们RecyclerView用来替换时,我们发现了很多问题ListView

  1. 没有用于列表项选择的onItemClickListener()- 解决方案

  2. 列表项之间没有分隔符- 解决方案

  3. 没有内置的重叠选择器,单击列表项时没有视觉反馈- 解决方案

  4. 列表头没有addHeaderView- 解决方案

也许更多的问题...

因此,当我们使用RecyclerViewreplace时ListView,我们必须做很多额外的编码才能达到与相同的效果ListView

题:

  • 我们完全替换ListView成值得RecyclerView吗?
  • 如果不是那么在这种情况下,我们应该更好地利用RecyclerView替代ListView,反之亦然?

9
您的主题只是第一个问题,而不是我的问题
Xcihnegn

3
请注意,如果您对使用折叠的操作栏感兴趣,则必须使用recyclerview。medium.com/android-bites/…–
francas

您应该使用recyclerview,因为它比listview提供更多的控制权。这有点复杂,但是只要到了那里,那么当您处理清单这类事情时,您的生活就会变得异常轻松。
Sadashiv

3
更好是好人的敌人。
oldgod

Answers:


118

如果ListView为您工作,则没有理由进行迁移。如果您正在编写新的UI,则使用RecyclerView可能会更好。

当您需要自定义列表或想要更好的动画时,RecyclerView是强大的。ListView中的便利方法给人们带来了很多麻烦,这就是为什么RecyclerView为他们提供更灵活的解决方案的原因。

您需要进行的主要更改是在适配器中。如果您想继续通话notifyDataSetChanged,则会失去大部分动画和绑定好处。但是,如果您可以更改适配器以调度详细的通知事件(添加/删除/移动/更新),那么您将获得更好的动画效果和性能。这些事件使RecyclerView选择正确的动画,还有助于避免不必要的onBind调用。如果您的项目视图很复杂,您将获得巨大的利益。此外,展望未来,RecyclerView周围还会有更多组件。


2
如果我能给你100票,我会。这种notifyDataSetChanged()方法使我RecyclerView一直在不断要求新ViewHolders的东西,从而破坏了ViewHolder模式的好处。寻找解决方案时,我发现您的评论通过:D很好地回答了我的问题。谢谢!
Aspiring Dev

我不同意“如果您的项目视图很复杂,您将获得巨大收益”,我拥有recyclerView,其中的适配器为3,否则,Recyclerview在我的情况下表现不佳。我不得不禁用回收使用isRecyclable(false);,最终结果是非常落后的RecyclerView。我什至无法更改,返回列表视图将花费很多时间:(
kashyap jimuliya

4
人们使用RV时使用更多类型的RV,而不会出现任何问题和良好的性能。您的代码中还有其他问题。您应该使用systrace / traceview看看发生了什么。
yigit '16

1
@kashyapjimuliya如yigit所述,3 if-else不应引起这种情况。首先,您没有提到将这些if-else放在何处;其次,禁用回收应该使它变慢而不是变快。为什么?因为扩大视图并进行findViewById()操作比以这种ViewHolder方式进行操作要昂贵得多。
苏菲安

24

据我说,如果ListView满足您应用程序的所有当前需求并满足所有用例,则无需用RecyclerView替换它。

RecyclerView为开发人员提供了强大的功能,但代价是增加了开发人员的复杂性。在ListView中某些可以轻松完成的事情现在可以花费很多不必要的精力。

但是,是的,ListView无法完成许多工作,例如令人惊叹的LayoutManager功能,该功能可以让您动态地无缝地将布局更改为水平,垂直,网格或交错网格。

我在这里就这个话题写了详细的答案。


3
当然,RecyclerView增加了复杂性,但至少它为您正确实现了ViewHolder模式。
IgorGanapolsky '16

@IgorGanapolsky +1用于ViewHolder模式实现。
Sreekanth Karumanaghat

您可以使用ListView编写自己的视图持有人模式

9

1您可以使用界面来提供点击监听器。我也将这种技术用于ListViews。
2没有分隔线:只需在您的行中添加一个宽度为match_parent且高度为1dp的视图,并为其提供背景色
3只需将StateList选择器用作行背景。
4在 列表视图中也可以避免addHeaderView:只需将Header 放在 View 之外

因此,如果您关心效率,那么可以,将ReviewerView替换为ListView是一个好主意。


19
这些不是我的问题,我有每个问题解决方案的链接
Xcihnegn 2015年

6

直到最近,我仍在使用ListView获得非常简单的列表。例如,如果我想显示一个简单的文本选项列表...

我的决定基于“人为因素”,即如果性能不重要,则用更少的代码创建一个简单的ListView会更好。我经常想到大学的一位教授,他喜欢这样说:“我的老师帕斯卡(Pascal)的发明家伟大的尼古拉斯·沃斯(Niclaus Wirth)曾经说过,如果一个程序有50行以上的代码,那肯定是错的……”

但是使我停止使用ListView的原因是,它最近与RelativeLayout一起被移到了Android Studio设计工具的“旧版”类别中。

https://developer.android.com/reference/android/widget/ListView

我认为这是“弃用”的“软”形式。如果实际上不建议使用它,并且所有尽职尽责的开发人员将其代码移至RecyclerView,那将造成破坏性。

此外,ListView的简介在顶部警告说RecyclerView是更好的选择:“要使用更现代,灵活和高效的方法来显示列表,请使用RecyclerView。”
https://developer.android.com/reference/android/widget/ListView

另外,ListView指南仍在讨论游标加载器,但是getSupportCursorLoader()本身在API 28中已被弃用
。https://developer.android.com/guide/topics/ui/layout/listview

Android Studio的最新增强功能:

文件->新建->片段->片段(列表)

这为我们提供了一个工作正常的RecylerView,其中填充了基本文本。这摆脱了我使用ListView的最后一个真正原因,因为现在设置基本的RecylerView变得一样容易。

总而言之,我不打算将ListView完全用于新开发,因为将其标记为“旧版”是离弃用它仅一步之遥。


3

仍然可以使用ListView的唯一情况是列表不是动态的或受网络事件影响时。例如:导航。

对于其他任何用途,RecyclerView都会使ListView黯然失色。由于RecyclerView只关心回收,因此在ListView中紧密关联的可视化相关事情将变得更容易,例如更改位置/重新排列,动画(实际上是RecyclerView.ItemAnimator附带的),自定义布局(除了StaggeredGrid外,库存还具有StaggeredGrid)旧列表或网格样式,但也有一个将该扩展得更多的)。

另外,如果您想使用CardView,我相信这是唯一的方法(使用Card或List时有一些不错的阅读方法)。


您是指从服务器获取数据列表,然后将其存储在电话的sqlite中以用于列表显示(可以说是您的关注者)中,所以最好使用回收者视图而不是带有视图持有者的listview ?
Lion789 '16

是。但确切地说,除了导航之外,我再也看不到ListView的任何作用,这是因为我认为在那里使用RecyclerView是过大的。
神话

2

一个很好的选择是使用BaseAdapter。它支持使用Viewholder模式,并且包含100多个带有位图和按钮的行,并且运行非常流畅。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.