我们应该使用 RecyclerView 来代替 ListView 吗? [关闭]

Posted

技术标签:

【中文标题】我们应该使用 RecyclerView 来代替 ListView 吗? [关闭]【英文标题】:Should we use RecyclerView to replace ListView? [closed] 【发布时间】:2015-04-08 04:13:53 【问题描述】:

android 文档说:

RecyclerView 小部件是一个更高级和灵活的版本 列表显示。此小部件是用于显示大型数据集的容器 通过保持有限的数量可以非常有效地滚动 的意见。收集数据时使用 RecyclerView 小部件 其元素在运行时根据用户操作或网络发生变化 事件

其实ListView只要不影响效率就可以做到以上所有,而我们用RecyclerView代替ListView时发现了很多问题:

    没有用于列表项选择的 onItemClickListener() - solution

    列表项之间没有分隔符 - solution

    没有内置重叠选择器,点击列表项时没有视觉反馈 - solution

    没有 addHeaderView 用于列表标题 - solution

也许还有更多问题...

所以当我们用RecyclerView代替ListView时,我们必须做很多额外的编码才能达到与ListView相同的效果。

问题:

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

【问题讨论】:

你的帖子只是第一个问题,不是我的问题 只要提一下,如果您对使用折叠操作栏感兴趣,您必须使用回收站视图。 medium.com/android-bites/… 你应该使用recyclerview,因为它提供了比listview更多的控制。它有点复杂,但你到了那里,每当你处理清单之类的事情时,你的生活就会变得非常轻松。 更好是善的敌人。 【参考方案1】:

如果 ListView 适合您,则没有理由迁移。 如果你正在编写一个新的 UI,你最好使用 RecyclerView。

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

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

【讨论】:

如果我能给你 100 票,我会的。 notifyDataSetChanged() 方法导致我的RecyclerView 一直要求新的ViewHolders,从而破坏了ViewHolder 模式的好处。在寻找解决方案时,我发现您的评论几乎可以回答我的问题:D 谢谢! 我不同意“如果您的项目视图很复杂,您将获得巨大的好处”,我有 recyclerView,其中适配器有 3,否则,Recyclerview 在我的情况下表现不佳。我不得不使用 isRecyclable(false); 禁用回收,最终结果是高度滞后的 RecyclerView。我什至无法更改,返回 listview 需要很多时间:( 人们使用带有更多类型的 RV,而不是没有任何问题和良好性能。您的代码中还有其他问题。你应该使用 systrace/traceview 看看发生了什么。 @kashyapjimuliya 正如 yigit 提到的,3 if-else 不应该导致这种情况。首先,您没有提到将这些 if-else 放在哪里;其次,禁用回收应该使它更慢而不是更快。为什么?因为膨胀视图并执行findViewById() 比以ViewHolder 方式执行要昂贵得多。【参考方案2】:

1您可以使用接口来提供点击监听器。我也将这种技术与 ListViews 一起使用。2 无分隔线:只需在您的行中添加一个宽度为 ma​​tch_parent 且高度为 1dp 的视图 并为其赋予背景颜色3只需使用 StateList 选择器作为行背景即可。4在 ListViews 中也可以避免 addHeaderView:只需将 Header 放在视图之外

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

【讨论】:

这些不是我的问题,每个问题解决方案我都有链接【参考方案3】:

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

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

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

我认为这是“弃用”的“软”形式。如果它真的被弃用并且所有认真的开发人员都将他们的代码移到了 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 用于新开发,因为将其标记为“遗留”距离弃用它仅一步之遥。

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

您是指从服务器获取数据列表,然后存储在手机上的 sqlite 中以用于列表显示(比如说您的关注者),最好使用回收器视图比带有视图持有者的列表视图? 是的。但准确地说,除了导航之外,我再也看不到 ListView 的任何角色,那是因为我认为在那里使用 RecyclerView 有点过头了。【参考方案5】:

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

【讨论】:

以上是关于我们应该使用 RecyclerView 来代替 ListView 吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Java 9 中不推荐使用 Observer。我们应该使用啥来代替它?

NestedScrollView,RecyclerView

我们应该使用啥来代替 Spring Security 的 JSP 标签库来在 HTML 页面中的客户端具有安全性?

RecyclerView的使用之HelloWorld

Android L 中的 RecyclerView ItemAnimator 故障

Android Material Design学习之RecyclerView代替 ListView