RecyclerView与ListView


295

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

RecyclerView小部件是ListView的更高级,更灵活的版本。

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

在此处输入图片说明

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

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



1
@ Dev786:我建议您在此处添加评论,以详细说明在此问题上已有的许多答案中所缺少的内容。
CommonsWare

Answers:


374

RecyclerView是为了ListView改进而创建的,因此可以,您可以创建带有ListView控件的附件列表,但是使用起来RecyclerView更容易,因为它:

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

  2. 将列表从其容器中解耦出来 -因此您可以在运行时通过set轻松将列表项放在不同的容器(linearLayout,gridLayout)中LayoutManager

例:

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
  1. 对常见的列表动作进行动画处理 -将动画解耦并委托给ItemAnimator

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

因此,总而言之,这RecyclerView是一种用于处理“列表数据”的更灵活的控件,该控件遵循关注委托的模式,而仅留给一项任务-回收项目。


16
列表视图的主要职责是1.)在给定区域内可视地安排项目,最好是2.)重新使用项目。使用RecylerView,它可以分解为单一职责-回收视图回收,并且LayoutManager可以在屏幕上排列项目。换句话说,回收视图不知道/不在乎将项目放在屏幕上的什么地方,它只是负责回收它们。来自android doc:“通过更改LayoutManager,RecyclerView可用于实现标准的垂直滚动列表,统一网格,交错网格,水平滚动集合等。”
daneejela 2015年

32
“在上/下滚动时重用单元格”:到目前为止,我完全知道这是错误的,因为即使在没有Viewholder的列表视图中,也会发生这种情况。
鲁班

16
列表视图中视图持有者的主要用途是:在滚动列表视图期间,您的代码可能经常调用findViewById(),这可能会降低性能。即使适配器返回膨胀视图以进行回收,您仍然需要查找元素并进行更新。重复使用findViewById()的一种方法是使用“视图持有者”设计模式。一个ViewHolder对象将每个组件视图存储在Layout的tag字段内,因此您可以立即访问它们,而无需重复查找它们。
鲁班

7
我要说的是,即使您在没有视图持有者的情况下实现listview,Row也将被回收。那就是listview的特性和优势。那就是他们创建的listview。
鲁班

他们没什么特别的,任何人都可以添加这些功能。您可以扩展ListView和baseAdapter并根据需要添加任何功能。两者之间实际上没有区别。
MDP

39

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

RecyclerView烘焙了这种模式,使其更难弄乱。它也更加灵活,可以更轻松地处理非直线形的不同布局,例如网格。


6
是的!,应该何时还不使用recyclerview 进行更多讨论。如果您的行具有根据模型数据动态添加的内容,并且您使用了Recycler视图BOOM。
拉娜(Rana Deep)

1
您应该能够基于模型数据添加动态内容。您只需要为要支持的任何类型的内容设置不同的视图。
CaptRespect 2015年

36

ListView是的祖先RecyclerView。有很多事情ListView没有做好,或者做得不好。如果您要收集的缺点ListView并通过将问题抽象到不同的域来解决问题,则最终会遇到类似“回收者视图”的问题。这是ListViews的主要问题点:

  • 没有View对相同的项目类型强制使用Reuse(ListView请参阅中使用的适配器之一,如果您研究getView方法,您将发现即使传递了一个,也不会阻止程序员为每一行创建一个新视图。通过convertView变量)

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

  • 仅支持带行显示视图的垂直滚动视图(Recycler视图不关心视图的位置和移动方式,它被抽象为LayoutManager。因此,Recycler可以支持上述传统视图ListView以及GridView,但它不仅限于此,它还可以做更多,但您必须做一些编程工作才能实现它。

  • 添加/删除的动画不是考虑的用例。完全由您决定如何解决(比较RecyclerView。Adapter类notify *方法提供的产品与ListViews以获得一个想法)。

简而言之,这RecyclerView是更灵活的ListView做法,尽管您可能需要进行更多的编码。


20

RecyclerView是准备来呈现类似的方式任何基于适配器的视图中创建新的ViewGroup。它可以认为是它的继承者,可以在网上ListView and GridView找到 latest support-v7 version。在RecyclerView已经开发了可扩展性考虑,所以它可以创建任何类型的布局,你能想到的,但也不是没有一点疼痛的最屁股剂量。

答案来自安东尼奥·莱瓦Antonio leiva)

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

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


5
我喜欢您的回答中的这句话:这是Android,所以绝非易事这对于Android应用程序的开发一直是正确的,但是我认为他们在设计API和构建模式方面出了点问题Android应用。从理论上讲,一个好的设计应该向程序员隐藏所有可能的复杂性(但对于高级程序员来说仍然是可访问的),他们通常关心的是业务逻辑,数据和其他算法,而不是努力处理与UI相关的问题(以及目前存在的更为繁琐的问题)在Android开发中)。
绝望了

18

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

如果ListView为您工作,则没有理由进行迁移。如果您正在编写新的UI,则使用RecyclerView可能会更好。

RecylerView具有内置的ViewHolder,不需要像listView那样实现我们自己的视图。它也支持在特定索引处通知

在RecyclerView中已经实现了诸如添加或删除项目动画之类的事情,而您无需执行任何操作

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

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

最好的是,我们可以根据需要动态地执行所有这些操作。


14

主要优点:

ViewHolder在中默认情况下不可用ListView。我们将在中显式创建getView()RecyclerView已内置Viewholder


4

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

  1. RV分离视图创建和数据与视图的绑定。在LV中,在将数据绑定到它之前,需要检查convertView是否为null以便创建视图。因此,对于RV,仅在需要时才创建视图,而对于LV,则可能会错过对convertview的检查,并且每次都会创建视图。

  2. 现在,使用LayoutManager可以更轻松地在Grid和List之间切换。

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

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

  5. 如果是RV,则非常简单的项目动画。


4

RecyclerView优于listview的优点:

  1. 默认情况下包含ViewHolder。

  2. 简单的动画。

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

listView优于recyclerView的优点:

  1. 易于添加分隔线。

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

  3. 支持页眉和页脚。

  4. 支持OnItemClickListner。


4
据我了解,您可以recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL));在执行以下操作之后轻松地将分隔线添加到recyclerView:recyclerView = view.findViewById(R.id.feed);
nviens

1
@nviens对于列表视图,您可以添加分隔符,调整分隔符的高度并更改其颜色,这些分隔符都在xml本身中。同样,目前对分频器的实现还可以,以前为recyclerview添加分频器是一场噩梦,只需检查此答案即可查看以前对分频器的实现情况stackoverflow.com/a/27037230/6478047
Manohar Reddy

4

RecyclerView和ListView之间的8个差异

Recyclerview与ListView

1. ViewHolder模式

用于减少对findViewById()方法的调用的模式。

在ListView中,无需使用ViewHolder即可轻松构建列表。但不是RecyclerView。

2.适配器

它们都是AdapterViews,是的。它基于适配器类工作。

使用ArrayAdapter,CursorAdapter等默认适配器可以轻松构建ListView,但是RecyclerView提供了RecyclerView.Adapter类,以创建新的自定义适配器类。

您不能将ArrayAdapter或任何其他内置适配器与RecyclerView一起使用。

3.项目安排

我用更少的代码创建了Vertical ListView。但是,如果我们需要创建一个GridView怎么办?

RecyclerView使用LayoutManager安排其项目。有3个LayoutManager类。

  • LinearLayoutManager-帮助创建线性类型列表。
  • GridLayoutManager-用于创建网格。
  • StaggeredGridLayoutManager-用于创建staggeredgrid。

动画制作

ListView缺少基本的动画。但是RecyclerView带有简单的动画。

分频器

机器人:分频器安卓dividerHeight属性或setDivider(),setDividerHeight()可以帮助您在ListView控件进行自定义分隔。

从25.1.0版本开始,您可以使用DividerItemDecoration类创建一个简单的分隔符。

点击事件

RecyclerView缺少OnItemClickListener,是的,这是非常可悲的。但是,它们通过提供RecyclerView.OnItemTouchListener,为开发人员提供了更多控制权

通知方法

您需要调用适当的notify *方法来执行正确的动画。与ListView相比,RecylcerView有很多notify *方法。


3

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


2

我认为RecyclerView是用列表视图中的回收模式来解决该问题的,因为这使开发人员的生活更加困难。您可以处理的所有其他事项。比如我用同一个适配器ListView,并GridView不要紧在两个视图中getViewgetItemCountgetTypeCount用于所以这是一样的。 RecyclerView不需要,如果ListViewListAdapterGridView有网适配器,你已经工作。如果您已正确实现ViewHolder列表视图中的模式,则不会看到的任何大改进RecycleView


2

我工作了一段时间,RecyclerView但仍然喜欢ListView

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

  2. A RecyclerView在编码中比较困难。

  3. A RecyclerView不包含页眉和页脚,因此为负号。

  4. 一个ListView不需要做出ViewHolder。如果您想拥有包含节或子标题的列表,则最好制作独立的项(不使用ViewHolder),它更容易且不需要单独的类。


1
您可以在recyclerview适配器中制作标头和内容端,它将比listview更灵活。只是很难将您的思维listview更改为recyclerview,但如果您可以做到,您将理解我的意思。不赞成使用listview只是去尝试学习recyclerview goodluck
erginduran

2
@erginduran,我都用过。ListView仍被广泛使用,并且不被弃用。而且它比RecyclerView浪费更少的内存。如果只想用RecyclerView替换ListView,那将不是一个好主意。
CoolMind

只是检查为什么这些家伙开发了recyclerview?它对listview的改进,对吗?Google Play中有许多旧的库和应用程序,因此您是正确的listview仍被广泛使用。只需保留过去的旧内容即可。检查比较-> 链接
erginduran

@erginduran,谢谢。没错,RecyclerView具有一些优势。我的回答是关于通常的任务,其中ListView有时比RecyclerView更容易。当然,在ListView中很难或不可能实现动画和其他一些改进。
CoolMind

我在该主题中添加了一些方面,请参见stackoverflow.com/a/39721769/2914140
CoolMind

1
  1. 您可以使用界面来提供点击监听器。我也将这种技术用于ListViews。
  2. 没有分隔线:只需在您的行中添加一个宽度为match_parent且高度为1dp的视图,并为其提供背景颜色。
  3. 只需使用StateList选择器作为行背景。
  4. 在ListViews中也可以避免addHeaderView:只需将Header放在View之外。

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


0

简单的答案:您应该在想要显示很多项目且其数量是动态的情况下使用RecyclerView。仅当项目数始终相同且限于屏幕尺寸时,才应使用ListView。

您发现它变得更加困难,因为您只考虑了Android库。

如今,有许多选项可以帮助您构建自己的适配器,从而轻松构建动态项目的列表和网格,您可以选择,重新排序,使用动画,分隔线,添加页脚,页眉等。

别害怕,尝试一下RecyclerView,您可以开始喜欢它,在ListView和RecyclerView中列出从网上下载的100个项目的列表(例如facebook新闻),您会发现UX(用户)的区别体验),当您尝试滚动时,测试应用可能会停止,甚至无法执行。

我建议您检查这两个库以简化适配器:

FastAdapter开发者:mikepenz

大卫的FlexibleAdapter


1
我认为您关于两者之间的性能差异的说法被夸大了。自2012年以来,我一直在生产应用程序中使用ListView,最多可显示3000个项目,每行具有约10个不同的视图,即使在旧的Android 2.3设备上,性能也绝对没有问题。
Magnus W

0

回收者查看信息

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

与相似ListViewRecyclerView’s主要思想是以性能友好的方式提供列表功能。巧合的是,此视图名称的“回收者”部分不存在。该RecyclerView实际上可以回收与它目前从事的项目。回收过程的完成归功于称为View Holder的模式。

RecyclerView的优点和缺点

优点:

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

缺点:

  • 增加了复杂性
  • 没有OnItemClickListener

ListView信息

ListView从一开始的Android已经出现。即使在中也可以使用API Level 1,它的用途与相同RecyclerView

ListView的用法实际上非常简单。在这方面,它不像其继任者。学习曲线比RecyclerView平滑。因此,更容易掌握。我们不必处理诸如LayoutManager,ItemAnimator或DiffUtil之类的问题。

ListView的优点和缺点

优点:

  • 简单用法
  • 默认适配器
  • 可用的OnItemClickListener
  • 这是 ExpandableListView

缺点:

  • 不包含ViewHolder模式的用法

0

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

  • ViewHolder模式在ListView中是完全可选的,但已烘焙到RecyclerView中。
  • ListView仅支持垂直滚动,但RecyclerView不仅限于垂直滚动列表。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.