我们应该使用RecyclerView来取代ListView吗?

Xci*_*egn 225 android listview android-recyclerview

Android文档说:

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

ListView如果效率无关紧要,实际上可以做到以上所有,我们在RecyclerView用来替换时发现了很多问题ListView:

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

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

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

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

也许更多问题......

因此,当我们使用RecyclerView替换时ListView,我们必须做更多的额外编码才能达到相同的效果ListView.

题:

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

yig*_*git 117

如果ListView适合您,则没有理由进行迁移.如果您正在编写新的UI,那么使用RecyclerView可能会更好.

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

您需要为迁移进行的主要更改是在适配器中.如果您想继续通话notifyDataSetChanged,则会失去大部分动画和装订优势.但是,如果您可以更改适配器以分派详细的通知事件(添加/删除/移动/更新),那么您可以获得更好的动画和性能.这些事件让RecyclerView选择了正确的动画,也有助于避免不必要的onBind调用.如果您的项目视图很复杂,您将获得巨大的收益.此外,未来,RecyclerView将会有更多组件.

  • 人们使用RV w /更多类型然后没有任何问题和良好的性能.您的代码中还有其他问题.您应该使用systrace/traceview并查看最新情况. (4认同)
  • 如果我能给你100个赞成票,我愿意.`notifyDataSetChanged()`方法导致我的`RecyclerView`不断要求新的`ViewHolders`,从而消除了`ViewHolder`模式带来的好处.寻找解决方案我发现你的评论几乎可以解决我的问题:D谢谢! (2认同)

Ari*_*Roy 23

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

RecyclerView以增加开发人员的复杂性为代价,为开发人员提供了巨大的动力.有些事情可以在ListView中轻松完成,现在可以花费很多不必要的努力.

但是,有些东西是ListView永远无法做到的,比如令人惊叹的LayoutManager功能,可以让你动态地将布局更改为水平,垂直,网格或交错网格.

我在这里写了一个关于这个主题的详细答案.

  • 当然,RecyclerView增加了复杂性,但至少它为您正确实现了ViewHolder模式。 (2认同)

Fan*_*mas 8

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

因此,如果您关心效率,那么是的,用RecyclerView替换ListView是个好主意.

  • 这些不是我的问题,我已经为每个问题解决方案提供了链接 (19认同)
  • 见**问题** (4认同)
  • 看这里:http://www.grokkingandroid.com/first-glance-androids-recyclerview/ (2认同)

Ell*_*lar 5

直到最近,我仍在使用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完全用于新开发,因为将其标记为“旧版”是离弃用它仅一步之遥。