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


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



听起来不错,但是当我看到这张示例图片时,我对两者之间的区别感到非常困惑。



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

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

评论

first-glance-androids-recyclerview

@ Dev786:我建议您在此处添加一条注释,详细说明该问题的许多现有答案中缺少的内容。

RecyclerView和ListView之间的8个区别

#1 楼

RecyclerView的创建是对ListView的改进,因此可以,您可以使用ListView控件创建附加列表,但使用RecyclerView则更容易,因为它可以:


上下滚动时重复使用单元格-这可以在ListView适配器中实现View Holder,但这是可选的,而在RecycleView中,这是编写适配器的默认方式。
将列表从其容器中分离出来-因此您可以在运行时轻松地放置列表项在具有设置LayoutManager的不同容器(linearLayout,gridLayout)中。

示例:

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




动画通用列出动作-将动画解耦并委托给ItemAnimator

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

因此,总而言之,RecyclerView是处理“列表数据”的更灵活的控件,遵循关注委托的模式,仅将一项任务留给自己-回收物品。

评论


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

– daneejela
2015年5月21日在10:11

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

–鲁班
16年5月11日在14:22

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

–鲁班
16年5月11日在14:22

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

–鲁班
16年5月11日在14:24

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

– M D P
2016年9月6日下午12:41

#2 楼

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

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

评论


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

–拉纳深
15年8月19日在12:27

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

–CaptRespect
2015年8月31日14:43

#3 楼

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


不强制使用View对相同项目类型重复使用(如果您研究getView,请查看ListView中使用的适配器之一)方法,您将看到即使通过convertView变量传入的行,也不会阻止程序员为每行创建一个新视图)
并不能防止昂贵的findViewById使用(即使您如上所述回收视图,也是如此)开发人员可以调用findViewById来更新子视图的显示内容。ViewHolder中的ListViews模式的主要目的是缓存findViewById调用。但是,仅当您知道它时才可用,因为它不是其中的一部分
仅支持带行显示视图的垂直滚动视图(Recycler视图不关心视图的位置和移动方式,它抽象为LayoutManager,因此Recycler可以支持传统的ListView作为如上所示,就像我们就像GridView之类的东西一样,但它不仅限于此,它还可以做更多的事情,但是您必须做一些编程工作才能使其实现。
未考虑添加或删除动画的用例。完全由您自己决定如何解决(比较RecyclerView。Adapter类notify *方法提供的产品与ListViews以获得一个想法)。

简而言之,RecyclerView是一个更灵活的选择ListView,尽管您可能需要做更多的编码。

#4 楼


RecyclerView是一个新的ViewGroup,它准备以类似的方式呈现任何基于适配器的视图。推测它是ListView and GridView的后继产品,可以在
latest support-v7 version中找到。 RecyclerView在开发时就考虑到了可扩展性,因此可以创建您可以想到的任何类型的
布局,但并非没有一点痛苦的
剂量。


Antonio leiva的答案

 compile 'com.android.support:recyclerview-v7:27.0.0'
确实比RecyclerViewpowerful view
有关更多详细信息您可以访问此页面。

评论


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

–绝望的
16 Jul 25'2:26

#5 楼

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


如果ListView适合您,则没有理由进行迁移。如果您正在编写新的UI,则最好使用RecyclerView。

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

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

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

i)LinearLayoutManager-它既支持垂直列表又包含水平
列表; ii)StaggeredLayoutManager-它支持Pinterest,如
交错列表,iii) GridLayoutManager-支持在Gallery应用程序中显示
网格。

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


#6 楼

主要优点:

ViewHolder默认情况下不可用。我们将在ListView内部显式创建。
getView()具有内置的RecyclerView

#7 楼

RecyclerView优于listview的优点:


默认情况下包含ViewHolder。
易于制作动画。
支持水平,网格和交错布局

优点recyclerView上的listView的列表:


易于添加分隔符。
可以将内置的arrayAdapter用于简单的普通列表
支持页眉和页脚。
支持OnItemClickListner。


评论


据我了解,您可以使用recyclerView.addItemDecoration(new DividerItemDecoration(getContext(),LinearLayoutManager.VERTICAL))轻松将分隔线添加到recyclerView中;在执行类似recyclerView = view.findViewById(R.id.feed)的操作之后;

– nviens
18年15月15日在16:43

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

–Manohar Reddy
18年11月16日在4:14

#8 楼

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

#9 楼

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


RV分离视图创建和将数据绑定到视图。
在LV中,您需要检查convertView是否为null。
因此,对于RV,仅在需要时才创建视图,但对于LV,则可能会错过对convertview的检查,并且每次都会创建视图。 br />现在,使用LayoutManager可以更轻松地在Grid和List之间进行切换。
即使仅更改了一个项目,也无需通知和更新所有项目。
如果是LV,则必须实现视图缓存。
默认情况下在RV中提供。 (视图缓存和回收之间是有区别的。)
对于RV,非常容易制作动画。


#10 楼

我认为RecyclerView用于解决列表视图中使用的回收模式的问题,因为这使开发人员的生活更加困难。
其他所有您或多或少都可以处理。
例如,我使用相同的方法适用于ListViewGridView的适配器在两个视图中都没有关系,因为使用了getViewgetItemCountgetTypeCount,所以它是相同的。
如果RecyclerViewListView或带有网格适配器的ListAdapter已经为您工作,则不需要GridView
如果您在列表视图中正确实现了ViewHolder模式,那么与RecycleView相比,您将看不到任何大的改进。

#11 楼

我对RecyclerView进行了一些工作,但仍然更喜欢ListView


当然,他们两个都使用ViewHolders,所以这不是优势。
RecyclerView编码起来更困难。
RecyclerView不包含页眉和页脚,因此是负号。
ListView不需要制作ViewHolder。如果您想拥有包含节或子标题的列表,则最好制作独立的项(没有ViewHolder),它更容易且不需要单独的类。


评论


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

– erginduran
16-09-25在12:55

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

– CoolMind
16-09-26在6:15

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

– erginduran
16-09-26在18:11

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

– CoolMind
16-09-26在18:39

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

– CoolMind
16-09-27在10:03

#12 楼


您可以使用界面来提供点击监听器。我也将这种
技术与ListViews一起使用。
没有分隔符:只需在您的行中添加一个宽度为
match_parent且高度为1dp的View,并为其提供背景颜色。
只需在行背景中使用StateList选择器即可。
也可以在ListViews中避免使用addHeaderView:只需将
因此,如果效率是您的担心,那么是的,用RecyclerView替换ListView是一个好主意。

#13 楼

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

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

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

不要害怕并尝试使用RecyclerView,您可以开始喜欢它,在ListView中列出从网上下载的100个项目(例如Facebook新闻),然后一个RecyclerView,当您尝试滚动时,您会看到UX(用户体验)的不同,可能测试应用程序会在您甚至无法执行之前就停止。

我建议您检查这两个库用于制作简单适配器的方法:

mikepenz的FastAdapter

davideas的FlexibleAdapter

评论


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

– Magnus W
18-10-1在8:13



#14 楼

RecyclerView info

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

ListView相似,RecyclerView’s的主要思想是以性能友好的方式提供列表功能。巧合的是,此视图名称的“回收者”部分不存在。 RecyclerView实际上可以回收当前正在使用的物品。回收过程是通过称为View Holder的模式完成的。

RecyclerView的优点和缺点

优点:


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

缺点:


增加了复杂性
没有OnItemClickListener

ListView信息

ListView具有自Android诞生以来就存在。即使在API Level 1中也可用,其目的与RecyclerView相同。

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

ListView的优点和缺点

优点:


/>简单用法
默认适配器
可用的OnItemClickListener
ExpandableListView的基础




不接受ViewHolder模式的使用


#15 楼

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


ViewHolder模式在ListView中是完全可选的,但已植入RecyclerView中。 > ListView仅支持垂直滚动,但RecyclerView不仅限于垂直滚动列表。


#16 楼

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

许可
占用空间更大,尤其是作为许多应用程序的一部分
如果可以从操作系统获得某些功能,则效率降低

/>但请注意,某些功能的实现(例如刷卡项目)来自RecyclerView。
上述所有内容都必须考虑在内。