回收视图与列表视图

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

回收视图小部件是一个更高级、更灵活的版本 列表视图。

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

enter image description here

使用自定义适配器,ListView可以很容易地创建上面的图片。

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

261793 次浏览

为了使列表视图具有良好的性能,您需要实现holder模式,这很容易搞砸,特别是当您想用几种不同类型的视图填充列表时。

RecyclerView烘焙了这个模式,使它更难以搞砸。它也更灵活,更容易处理不同的布局,不是直线,如网格。

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));
  1. 动画常用的列表动作 -动画被解耦并委托给ItemAnimator

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

因此,总结起来,RecyclerView是一个更灵活的控件,用于处理“列表数据”,它遵循关注的委托模式,只留给自己一个任务——回收项。

RecyclerView是一个新的ViewGroup,准备呈现任何 以类似的方式创建基于适配器的视图。它应该是 ListView and GridView的继承对象,它可以在 latest support-v7 versionRecyclerView已被开发 可扩展性,因此可以创建任何类型的 你能想到的布局,但也不能没有一点恼人的地方 剂量。< / p >

答自安东尼奥·莱

 compile 'com.android.support:recyclerview-v7:27.0.0'

RecyclerView确实是ListViewpowerful view。 要了解更多详细信息,请访问这个页面

ListViewRecyclerView的祖先。有很多事情ListView要么没有做,要么做得不好。如果你要收集ListView的缺点,并通过将问题抽象到不同的域来解决问题,你最终会得到类似于回收器视图的东西。下面是ListViews的主要问题点:

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

  • 没有阻止昂贵的findViewById的使用(即使你是回收上面提到的视图,开发人员也有可能调用findViewById来更新子视图的显示内容。ListViewsViewHolder模式的主要目的是缓存findViewById调用。然而,这只有在你知道它的情况下才能使用,因为它根本不是平台的一部分)

  • 仅支持垂直滚动和行显示视图(回收器视图不关心视图放在哪里以及如何移动,它被抽象为LayoutManager。因此,Recycler可以支持如上所示的传统ListView,以及像GridView这样的东西,但它不限于此,它可以做更多的事情,但你必须做编程的基础工作来实现它)。

  • 要添加/删除的动画不是考虑的用例。这完全取决于你如何去做这件事(比较RecyclerView。适配器类notify*方法提供v. ListViews来获得一个想法)。

简而言之,RecyclerViewListView的一个更灵活的版本,尽管你可能需要做更多的编码工作。

主要优势:

ViewHolderListView中默认不可用。我们将在getView()中显式地创建。 RecyclerView内置了Viewholder.

在我看来,RecyclerView是为了解决在列表视图中使用的循环模式的问题,因为它使开发人员的生活更加困难。 其他的你多少都能应付。 例如,我为ListViewGridView使用相同的适配器,在两个视图中都使用getViewgetItemCountgetTypeCount,因此它是相同的。 如果你已经使用了带有网格适配器的ListViewGridView,则不需要RecyclerView。 如果你在你的列表视图中正确地实现了ViewHolder模式,那么你不会看到比RecycleView有任何大的改进

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

以下是RecyclerView和amp之间的几个关键点/区别;列表视图。明智地接电话。

如果ListView适合你,就没有迁移的理由。如果你是 写一个新的UI,你可能会更好地使用RecyclerView RecylerView有内置的ViewHolder,不需要实现我们自己的 比如在listView中。它支持通知特定索引以及

像动画的添加或删除项目已经 在RecyclerView中实现,而不需要做任何事情

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

i) LinearLayoutManager -同时支持垂直和水平 ii) StaggeredLayoutManager -它支持Pinterest喜欢 交错列表,iii) GridLayoutManager -支持显示

最好的是我们可以动态地做这些事情。

我使用了一些RecyclerView,仍然更喜欢ListView

  1. 当然,它们都使用ViewHolders,所以这不是一个优势。

  2. RecyclerView在编码中更加困难。

  3. RecyclerView不包含页眉和页脚,所以它是一个减号。

  4. ListView不需要创建ViewHolder。如果你想要一个带有分段或子标题的列表,那么创建独立的项(没有ViewHolder)是个好主意,这样更容易,也不需要单独的类。

除了以上差异之外,还有以下几个:

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

  2. 现在使用LayoutManager在网格和列表之间切换更加容易。

  3. 不需要通知和更新所有项目,即使只有一个项目被更改。

  4. 在LV的情况下,必须实现视图缓存。 默认情况下,它在RV中提供。(视图缓存和循环有区别)

  5. 非常容易的项目动画在RV的情况下。

  1. 可以通过接口提供click监听。我用这个
  2. 无分隔符:只需在行中添加宽度为的视图 Match_parent和1dp的高度,并给它一个背景色
  3. 简单地使用StateList选择器作为行背景。
  4. addHeaderView也可以在ListViews中避免:只需将

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

简单的回答:在想要显示许多项,并且它们的数量是动态的情况下,应该使用RecyclerView。ListView应该只在项目数量总是相同并且受屏幕大小限制的情况下使用。

你会发现这很难,因为你只考虑Android库。

现在有很多选项可以帮助您构建自己的适配器,使您可以轻松地构建动态项目的列表和网格,您可以选择、重新排序、使用动画、分隔符、添加页脚、页眉等等。

不要害怕,给一个尝试RecyclerView,你可以开始喜欢它从一个ListView和一个RecyclerView中从网络下载的100个项目的列表,当你尝试滚动时,你会看到UX(用户体验)的差异,可能测试应用程序会在你甚至可以这样做之前停止。

我建议你检查这两个库来制作简单的适配器:

FastAdapter by mikepenz

FlexibleAdapter by davideas

RecyclerView相对于listview的优点:

  1. 默认包含ViewHolder。

  2. 简单的动画。

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

listView相对于recyclerView的优点:

  1. 易于添加分隔线。

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

  3. 支持页眉和页脚。

  4. 支持OnItemClickListner。

RecyclerView信息

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

ListView类似,RecyclerView’s的主要思想是以一种性能友好的方式提供列表功能。这个视图名称中的“Recycler”部分并不是巧合。RecyclerView实际上可以回收当前正在使用的项。回收过程是通过一个名为观点持有者的模式完成的。

优点,RecyclerView的缺点

优点:

  • 集成的动画添加,更新和删除项目
  • 通过使用ViewHolder模式强制循环视图
  • 同时支持网格和列表
  • 支持垂直和水平滚动
  • 可以和DiffUtil一起使用吗

缺点:

  • 增加了复杂性
  • 没有OnItemClickListener

列表视图的信息

ListView在Android诞生之初就已经存在了。它甚至在API Level 1中可用,并且与RecyclerView具有相同的用途。

ListView的用法其实很简单。在这方面,它不像它的后继者。学习曲线比RecyclerView更平滑。因此,它更容易掌握。我们不需要处理LayoutManager, ItemAnimator或DiffUtil之类的东西。

优点,ListView的缺点

优点:

  • 简单的使用
  • 默认的适配器
  • 可用OnItemClickListener
  • 它是ExpandableListView的基础

缺点:

  • 没有使用ViewHolder模式

ListView和RecyclerView之间有很多区别,但你应该特别注意以下几点:

  • ViewHolder模式在ListView中是完全可选的,但它被烘焙到RecyclerView中。
  • ListView只支持垂直滚动,但RecyclerView并不局限于垂直滚动列表。

我只是想强调RecyclerView是兼容包的一部分。这意味着每个应用程序都有自己的RecyclerView实现,而不是使用来自操作系统的特性和代码。潜在地,类似RecyclerView的功能可以成为未来操作系统的一部分,从那里使用它是有益的。例如,Harmony OS很快就会发布。将来可以更改兼容性包许可证,这可能是一种暗示。缺点总结:

  1. 许可
  2. 更大的足迹,尤其是作为许多应用程序的一部分
  3. 如果一些来自操作系统的功能可以存在,那么效率就会下降

但值得注意的是,一些功能的实现,如滑动项目,来自RecyclerView。

以上所说的一切都必须加以考虑。