我们应该用RecyclerView来代替ListView吗?

Android文档显示:

RecyclerView小部件是一个更高级和灵活的版本 列表视图。这个小部件是用于显示大型数据集的容器 通过保持有限的数量,可以非常有效地滚动 的观点。当您有数据收集时,使用RecyclerView小部件 哪些元素在运行时根据用户操作或网络更改 事件< / p >

实际上,如果效率不重要的话,ListView可以完成以上所有工作,并且当我们使用RecyclerView替换ListView时,我们发现了许多问题:

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

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

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

  4. No addHeaderView for list header - solution

也许还有更多问题……

因此,当我们使用RecyclerView来代替ListView时,我们必须做很多额外的编码来达到与ListView相同的效果。

问题:

  • RecyclerView完全替换ListView值得吗?
  • 如果不是,那么在哪种情况下我们应该更好地使用RecyclerView而不是ListView,反之亦然?
79841 次浏览

1你可以使用一个接口来提供一个点击监听器。我在ListViews中也使用了这种技术 2没有分隔符:只需在行中添加一个宽为match_parent、高为1 dp的视图,并给它一个背景颜色.
3.简单地为行背景使用一个StateList选择器 4 addHeaderView也可以在ListViews中避免:只需将Header 放在视图中。

所以,如果你关心的是效率,那么是的,用RecyclerView替换ListView是个好主意。

如果ListView适合你,就没有迁移的理由。 如果你正在编写一个新的UI,你可能更适合使用RecyclerView

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

迁移需要做的主要更改是在适配器中。如果你想继续调用notifyDataSetChanged,你将失去大部分动画&绑定的好处。但是如果您可以更改适配器以分派详细的通知事件(添加/删除/移动/更新),那么您将获得更好的动画和性能。这些事件让RecyclerView选择正确的动画,也帮助它避免不必要的onBind调用。如果项视图很复杂,您将获得巨大的好处。此外,未来还会有更多围绕RecyclerView的组件。

使用ListView仍然没问题的唯一情况是列表是静态的。例如:导航。

对于其他一切使用RecyclerView。由于RecyclerView处理回收,它将更容易做与ListView紧密耦合的视觉相关的事情,如改变位置/重排,动画(实际上它带有RecyclerView.ItemAnimator),自定义布局。

如果你想使用CardView,我相信这是唯一的方法。

一个很好的替代方案是使用BaseAdapter。它支持使用Viewholder模式,我的包含100+行位图和按钮,运行非常流畅。

直到最近我还在用ListView来做简单的列表。例如,如果我想显示一个简单的文本选项列表……

我基于“人为因素”的决定,如果性能不重要的话,用更少的代码创建一个简单的ListView会更好。我经常想起大学里的一位教授,他喜欢说:“我的老师,伟大的Niclaus Wirth, Pascal的发明者,曾经说过,如果一个程序的代码超过50行,那么它肯定是错误的……”

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

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

我认为这是“弃用”的“软”形式。如果它真的被弃用了,并且所有认真的开发人员都将他们的代码转移到RecyclerView,那就太有破坏性了。

此外,ListView的介绍在顶部警告说RecyclerView是一个更好的选择:“对于一个更现代、更灵活、更高效的显示列表的方法,使用RecyclerView。”< br > https://developer.android.com/reference/android/widget/ListView < / p > 同样,ListView的指南仍然在谈论游标加载器,但是getSupportCursorLoader()本身在API 28中已经被弃用 https://developer.android.com/guide/topics/ui/layout/listview < / p >

Android Studio的最新增强:

File -> New -> Fragment -> Fragment (List)
. File -> New -> Fragment -> Fragment (List)
. File

这给了我们一个完全工作的RecylerView填充基本文本。这消除了我使用ListView的最后一个真正原因,因为现在设置一个基本的RecylerView非常容易。

总之,我根本不打算在新的开发中使用ListView,因为标记它有“遗留”是弃用它的一步之遥。