首页 文章

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

提问于
浏览
215

Android Docs说:

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

实际上 ListView 可以在效率无关紧要的情况下完成上述所有操作,当我们使用 RecyclerView 替换 ListView 时,我们发现了很多问题:

  • 列表项选择没有onItemClickListener() - solution

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

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

  • 没有 addHeaderView 列表 Headers - solution

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

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

QUESTION:

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

6 回答

  • 21

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

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

    但是,有很多事情是ListView永远无法做到的,比如令人惊叹的LayoutManager功能,它可以让您动态地将布局无缝地更改为水平,垂直,网格或交错网格 .

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

  • 3

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

  • 0

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

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

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

  • 8

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

    因此,如果你关注效率,那么 yes ,用RecyclerView替换ListView是个好主意 .

  • 115

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

    对于任何其他用途,RecyclerView日食ListView . 由于RecyclerView只关心回收,因此更容易做到在ListView中紧密耦合的视觉相关事物,如更改位置/重新排列,动画(事实上它附带RecyclerView.ItemAnimator),自定义布局(除了库存还有StaggeredGrid)旧的列表或网格样式,但也有这个library,它扩展了更多) .

    此外,如果你想使用CardView我相信它是唯一的方法(一些good reading什么时候使用卡或列表) .

  • 1

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

    我基于“人为因素”做出了这个决定,如果性能不重要的话,用更少的代码创建一个简单的ListView会更好 . 我经常想到大学里的一位教授喜欢说:“我的老师,帕斯卡的发明者,伟大的尼克劳斯·沃斯(Niclaus Wirth)曾经说过,如果一个程序有超过50行代码,那肯定是错的......”

    但是说服我停止使用ListView的原因是它最近已经被移植到Android Studio设计工具中的“Legacy”类别以及RelativeLayout .

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

    我认为这是'软'形式的'弃用' . 如果它实际上被弃用并且所有尽职尽责的开发人员都移动他们,那将是太具有破坏性代码到RecyclerView .

    此外,ListView的简介在顶部警告RecyclerView是一个更好的选择:"For a more modern, flexible, and performant approach to displaying lists, use 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进行新开发,因为将其标记为“遗留”与弃用它相距仅一步之遥 .

相关问题