【问题标题】:Android Recyclerview vs ListView with ViewholderAndroid Recyclerview vs ListView 与 Viewholder
【发布时间】:2015-04-16 00:01:19
【问题描述】:

我最近遇到了android 5.0 发布的RecyclerView,似乎RecyclerView 只是一个封装的传统ListView,其中包含了ViewHolder 模式,它促进了视图的重用,而不是而不是每次都创建它。

使用 RecyclerView 的其他好处是什么? 如果两者在性能方面具有相同的效果,为什么会更喜欢 RecyclerView 呢?

编辑

我发现有人问过类似的问题,但答案不是结论性的,在此添加以作记录。

Recyclerview vs Listview

Should we use RecyclerView to replace ListView?

Why doesn't RecyclerView have onItemClickListener()? and How RecyclerView is different from Listview?

【问题讨论】:

  • 因为RecyclerView 速度更快,功能更丰富,API 也更好。 RecyclerView 中已经实现了诸如动画添加或删除项目之类的功能,而您无需执行任何操作。毫无疑问,把你的ListView扔进垃圾桶,RecyclerView是来抢戏的。
  • 您可以将布局管理器与 RecyclerView 相关联,因此它们不限于垂直滚动列表。这是非常强大的附加功能。
  • @Alan - “不限于垂直滚动列表”是什么意思?你是说回收视图也可以充当 Gridview 和 ListView 的“占位符”?
  • @XaverKapeller - 如果您能列出两者之间的差异并回答问题而不是发表评论,那就太好了,这样它可能会帮助我和将来可能想知道的其他人关于同一件事?
  • @Alan - 您能否提供一些有关您的意思的详细信息并回答问题而不是发表评论。感谢您抽出宝贵时间

标签: android performance listview android-recyclerview


【解决方案1】:

使用RecycleView的另一个好处是动画,两行代码就可以搞定

RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator();
        recyclerView.setItemAnimator(itemAnimator);

但小部件仍然是原始的,例如您无法创建 headerfooter

【讨论】:

  • 从这个意义上说,您永远无法创建页眉和页脚。它们只是适配器中的其他视图类型。列表视图将您的适配器包装在 HeaderViewListAdapter 中,并在后台添加标题支持。有了RecyclerView,您就是掌控者。
  • RecyclerView 默认使用 DefaultItemAnimator。那你为什么用这个代码?
【解决方案2】:

好吧,稍微挖掘一下,我就在 RecycleView 上的 Bill Philips article 上找到了这些宝石

RecyclerView 可以做的比 ListView 还多,但是 RecyclerView 类 本身的职责比 ListView 少。盒子外面, RecyclerView 没有:

  • 在屏幕上定位项目
  • 动画视图
  • 处理除滚动之外的任何触摸事件

所有这些东西都被烘焙到 ListView 中,但是 RecyclerView 使用 协作者类来代替这些工作。

您创建的 ViewHolders 也更强大。他们子类 RecyclerView.ViewHolder,里面有一堆方法RecyclerView 用途。 ViewHolders 知道他们当前绑定到哪个位置,如 以及哪些项目 ID(如果有的话)。在此过程中,ViewHolder 已被封为爵士。过去,ListView 的工作就是坚持 整个项目视图,ViewHolder 只保留其中的一小部分。

现在,ViewHolder 在ViewHolder.itemView 中保留了所有这些内容 字段,在 ViewHolder 的构造函数中为您分配。

【讨论】:

    【解决方案3】:

    更多来自Bill Phillip's 的文章(去阅读吧!)但我认为指出以下内容很重要。

    在 ListView 中,关于如何处理点击事件存在一些歧义:应该由单个视图处理这些事件,还是 ListView 应该通过 OnItemClickListener 处理它们?然而,在 RecyclerView 中,ViewHolder 处于一个明确的位置,可以充当处理这些细节的行级控制器对象。

    我们之前看到 LayoutManager 处理定位视图,而 ItemAnimator 处理它们的动画。 ViewHolder 是最后一块:它负责处理 RecyclerView 显示的特定项目上发生的任何事件。

    【讨论】:

      【解决方案4】:

      我使用带有 Glide 图像加载器的 ListView,内存在增长。然后我用RecyclerView 替换了ListView。它不仅编码难度更大,而且比ListView 占用更多的内存。至少,在我的项目中。

      在另一个活动中,我使用了一个带有EditText's 的复杂列表。其中一些输入法可能会有所不同,也可以应用TextWatcher。如果我使用ViewHolder,我如何在滚动期间替换TextWatcher?所以,我使用了ListView 而不使用ViewHolder,它可以工作。

      【讨论】:

      • 我使用了一个没有 ViewHolder 的 ListView,它可以工作。 糟糕的想法...... 如何在滚动期间替换 TextWatcher?不需要替换它......只是TextWacher应该在重用后将数据放入不同的容器......并且可以很容易地完成
      • @Selvin,感谢您的意见。现在我无法编辑该项目。屏幕上有几个TextWatchers。可能你是对的,但我无法检查出来。
      【解决方案5】:

      在向上/向下滚动时重用单元格 - 这可以通过在 listView 适配器中实现 View Holder 来实现,但它是可选的,而在 RecycleView 中它是编写适配器的默认方式。

      将列表与其容器解耦 - 这样您就可以在运行时通过设置 LayoutManager 轻松地将列表项放入不同的容器(linearLayout、gridLayout)中。

      例子:

      mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
      mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
      //or
      mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
      mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3));
      
      • 动画常见的列表动作。

      • 动画被解耦并委托给ItemAnimator

      关于RecyclerView还有很多,但我认为这几点是主要的。

      布局管理器

      i) LinearLayoutManager - 支持垂直和水平列表,

      ii) StaggeredLayoutManager - 支持 Pinterest 之类的交错列表,

      iii) GridLayoutManager - 支持在图库应用中显示网格。

      最好的事情是我们可以根据需要动态地完成所有这些工作。

      【讨论】:

        【解决方案6】:

        RecyclerView 是作为 ListView 改进创建的,所以是的,您可以使用 ListView 控件创建附加列表,但使用 RecyclerView 更容易:

        1. 在向上/向下滚动时重用单元格:这可以通过在 ListView 适配器中实现 View Holder 来实现,但它是可选的,而在 RecycleView 中它是默认的写入方式适配器。

        2. 将列表与其容器解耦:因此您可以通过设置 LayoutManager 在运行时轻松地将列表项放入不同的容器(linearLayout、gridLayout)中。

        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));

        1. 动画常见列表动作:动画被解耦并委托给 ItemAnimator。 关于 RecyclerView 还有更多,但我认为这几点是主要的。

        因此,总而言之,RecyclerView 是一种更灵活的控件,用于处理“列表数据”,它遵循关注点委托的模式,并且只为自己留下一个任务 - 回收项目。

        【讨论】:

          【解决方案7】:

          如果您使用 RecycleView,首先您需要花费更多的精力进行设置。您需要花更多的时间来设置简单的 Item onclick、边框、触摸事件和其他简单的东西。但最终产品将是完美的。

          所以决定权在你。我建议,如果您设计像电话簿加载这样的简单应用程序,只需单击项目就足够了,您可以实现列表视图。但是,如果您设计像社交媒体主页那样无限滚动。物品之间有几种不同的装饰,对单个物品的控制比使用回收视图要多。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-12-30
            • 1970-01-01
            • 2021-11-29
            • 2019-09-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多