RecyclerView小部件是ListView的更高级,更灵活的版本。
听起来不错,但是当我看到这张示例图片时,我对两者之间的区别感到非常困惑。
上面的图片可以由
ListView
使用自定义适配器轻松创建。那么,在什么情况下应该使用
RecyclerView
? #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 楼
ListView
是RecyclerView
的祖先。 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'
确实比RecyclerView
的powerful 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
用于解决列表视图中使用的回收模式的问题,因为这使开发人员的生活更加困难。其他所有您或多或少都可以处理。
例如,我使用相同的方法适用于
ListView
和GridView
的适配器在两个视图中都没有关系,因为使用了getView
,getItemCount
,getTypeCount
,所以它是相同的。如果
RecyclerView
和ListView
或带有网格适配器的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 infoRecyclerView
是与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。
上述所有内容都必须考虑在内。
评论
first-glance-androids-recyclerview@ Dev786:我建议您在此处添加一条注释,详细说明该问题的许多现有答案中缺少的内容。
RecyclerView和ListView之间的8个区别