RecyclerView与ListView

Bla*_*ama 271 android listview android-recyclerview

来自android开发人员(创建列表和卡片):

RecyclerView小部件是ListView的更高级和灵活的版本.

好吧,这听起来很酷,但是当我看到这个示例图片时,我对两者之间的区别感到非常困惑.

在此输入图像描述

ListView使用自定义适配器可以轻松创建上面的图片.

那么,在什么情况下应该使用RecyclerView

dan*_*ela 356

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));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
Run Code Online (Sandbox Code Playgroud)
  1. 动画常用列表操作 - 动画被解耦并委托给ItemAnimator.

有关RecyclerView的更多信息,但我认为这些是主要的.

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

  • "向上/向下滚动时重复使用单元格":到目前为止,我知道这是完全错误的,因为即使在没有查看者的listview中也会发生这种情况. (30认同)
  • 列表视图的主要职责是1.)在给定区域内可视地排列项目,最好是2.)重用项目.使用RecylerView,这会分解为单一职责 - 回收视图回收,并且给定LayoutManager在屏幕上排列项目.换句话说,回收视图不知道/关心在屏幕上放置项目的位置,它只是负责回收它们.来自android doc:"通过更改LayoutManager,RecyclerView可用于实现标准的垂直滚动列表,统一网格,交错网格,水平滚动集合等等." (15认同)
  • listview中视图持有者的主要用途是您的代码可能在滚动ListView期间经常调用findViewById(),这会降低性能.即使适配器返回一个膨胀的视图以进行回收,您仍然需要查找元素并更新它们.重复使用findViewById()的方法是使用"视图持有者"设计模式.ViewHolder对象将每个组件视图存储在Layout的标记字段中,因此您可以立即访问它们而无需重复查找它们. (15认同)
  • 我试图说的是,即使你没有查看持有者实现listview,Row也会被回收.这就是listview的属性和优势.这就是他们创建listview的原因. (6认同)

Cap*_*ect 36

对于具有良好性能的列表视图,您需要实现持有者模式,这很容易搞乱,特别是当您想要使用几种不同类型的视图填充列表时.

RecyclerView将这种模式融入其中,使其变得更加困难.它也更灵活,可以更轻松地处理不同的线性布局,如网格.

  • 是的!,关于何时*NOT*也应该有更多的讨论来使用recyclerview.如果您的行根据模型的数据动态添加内容,则使用Recycler视图BOOM. (6认同)

Jim*_*aca 34

ListView是的祖先RecyclerView.有许多事情ListView要么没有做,要么做得不好.如果你要收集问题的缺点ListView并通过将问题抽象到不同的域来解决问题,那么你最终会得到像回收者视图这样的东西.以下是ListViews的主要问题点:

  • 没有强制View重用相同的项目类型(查看一个在a中使用的适配器ListView,如果你学习getView方法,你会发现没有什么能阻止程序员为每一行创建一个新视图,即使传入一个通过convertView变量)

  • 未避免代价高昂的findViewById用途(即使你被回收的意见,指出上面有可能对开发者进行调用findViewById,以更新的子视图显示的内容.在的主要目的ViewHolder图案ListViews是缓存findViewById的电话.然而,这只是如果您知道它可用,因为它根本不是平台的一部分)

  • 仅支持带有行显示视图的垂直滚动(Recycler视图不关心视图放置的位置以及它们的移动方式,它被抽象为a LayoutManager.因此,Recycler可以支持传统,ListView如上所示,以及类似的东西GridView,但是它不仅限于此,它可以做更多,但你必须做编程脚工作才能实现它).

  • 添加/删除的动画不是考虑的用例.完全取决于你如何解决这个问题(比较RecyclerView.适配器类通知*方法产品v.ListViews以获得一个想法).

简而言之,虽然可能需要对您进行更多编码,但RecyclerView更灵活ListView一点.


Int*_*iya 20

RecyclerView是一个新的ViewGroup,它准备以类似的方式呈现任何基于适配器的视图.它被认为是继承者ListView and GridView,它可以在中找到 latest support-v7 version.它的RecyclerView开发具有可扩展性,因此可以创建您能想到的任何类型的布局,但不能没有一点点痛苦的剂量.

答案取自Antonio leiva

 compile 'com.android.support:recyclerview-v7:27.0.0'
Run Code Online (Sandbox Code Playgroud)

RecyclerView确实是一个powerful viewListView.有关详细信息,请访问此页面.

  • 我喜欢你的答案中的这句话:**这是Android,所以事情永远都不容易**这对于Android应用程序开发的情况确实如此,但我认为他们如何设计API以及它是错误的.构建Android应用程序的模式.从理论上讲,一个好的设计应该隐藏程序员的所有可能的复杂性(但仍然可以用于高级程序),他们通常关心的是业务逻辑,数据和其他算法,而不是处理与UI相关的问题(以及目前存在的更繁琐的问题)在Android开发中). (4认同)

Paw*_*ari 17

以下是RecyclerView和ListView之间的几个关键点/差异.明智地接听电话.

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

RecylerView内置了ViewHolder,不需要在listView中实现我们自己的类似.它也支持特定索引的通知

动画添加或删除项目的内容已在RecyclerView中实现,无需您执行任何操作

我们可以将布局管理器与RecyclerView相关联,这可以用于获取recycleview中的随机视图,而这是ListView中的限制.在ListView中,唯一可用的视图类型是垂直ListView.甚至没有官方的方法来实现水平ListView.现在使用RecyclerView,我们可以拥有一个

i)LinearLayoutManager - 支持垂直和水平列表,ii)StaggeredLayoutManager - 支持交错列表等Pinterest,iii)GridLayoutManager - 支持显示在Gallery应用程序中看到的网格.

最棒的是我们可以根据需要动态完成所有这些操作.


Moh*_*n N 14

主要优势:

ViewHolder在默认情况下不可用ListView.我们将在内部明确创建getView(). RecyclerView有内置的Viewholder.


Man*_*ddy 9

RecyclerView 相对于 listview 的优点:

  1. 默认包含 ViewHolder。

  2. 简单的动画。

  3. 支持水平、网格和交错布局

listView 优于 recyclerView 的优点:

  1. 易于添加分隔线。

  2. 可以将内置的 arrayAdapter 用于简单的普通列表

  3. 支持页眉和页脚。

  4. 支持 OnItemClickListner 。

  • 据我所知,您可以使用 `recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL));` 在执行类似 `recyclerView = view.findViewById(R.id.feed );` (5认同)

Mus*_*ven 6

我认为他们的主要和最大的区别是ListView在创建或放置项目时查找项目的位置,另一方面RecyclerView查找项目的类型。如果使用相同类型创建了另一个项目,RecyclerView则不会再次创建它。它首先询问适配器,然后询问回收池,如果回收池说“是的,我已经创建了一个类似于它的类型”,则RecyclerView不会尝试创建相同的类型。ListView没有这种池化机制。


Bas*_*asi 6

回收商查看信息

\n\n

RecyclerView与 一起引入的Android 5.0 (Lollipop)。它包含在支持库中。因此,它与 Android API Level 7 兼容。

\n\n

与 类似ListViewRecyclerView\xe2\x80\x99s主要思想是以性能友好的方式提供列表功能。此视图\xe2\x80\x99s 名称的\xe2\x80\x98Recycler\xe2\x80\x99 部分并非巧合。实际上可以回收它RecyclerView当前使用的\xe2\x80\x99s 项目。回收过程是通过称为View Holder 的模式完成的。

\n\n

RecyclerView 的优点和缺点

\n\n

优点:

\n\n
    \n
  • 用于添加、更新和删除项目的集成动画
  • \n
  • 使用 ViewHolder 模式强制回收视图
  • \n
  • 支持网格和列表
  • \n
  • 支持垂直和水平滚动
  • \n
  • 可以与 DiffUtil 一起使用
  • \n
\n\n

缺点:

\n\n
    \n
  • 增加了复杂性
  • \n
  • 没有 OnItemClickListener
  • \n
\n\n

列表查看信息

\n\n

ListView自 Android 诞生之初就已存在。它甚至可以在 中使用,API Level 1并且与RecyclerView.

\n\n

ListView的使用其实非常简单。在这方面,它\xe2\x80\x99不像它的后继者。学习曲线比 RecyclerView 更平滑。因此,更容易掌握。我们不需要处理诸如 LayoutManager、ItemAnimator 或 DiffUtil 之类的事情。

\n\n

ListView 的优点和缺点

\n\n

优点:

\n\n
    \n
  • 简单的用法
  • \n
  • 默认适配器
  • \n
  • 可用的 OnItemClickListener
  • \n
  • 它\xe2\x80\x99s的基础ExpandableListView
  • \n
\n\n

缺点:

\n\n
    \n
  • 不\xe2\x80\x99t 接受 ViewHolder 模式的使用
  • \n
\n


Vir*_*t18 5

除了上述差异外,还有以下几点:

  1. RV 将视图创建和数据绑定到视图分开。在 LV 中,您需要在将数据绑定到它之前检查 convertView 是否为 null 以创建视图。因此,在 RV 的情况下,只会在需要时创建视图,但在 LV 的情况下,您可能会错过对 convertview 的检查,并且每次都会创建视图。

  2. 现在使用 LayoutManager 在 Grid 和 List 之间切换更加容易。

  3. 无需通知和更新所有项目,即使仅更改单个项目。

  4. 在 LV 的情况下,必须实现视图缓存。默认情况下,它在 RV 中提供。(视图缓存和回收之间存在差异。)

  5. 在 RV 的情况下非常简单的项目动画。