RecyclerView与ListView
从android开发者( 创build列表和卡片 ):
RecyclerView小部件是ListView的更高级和灵活的版本。
好吧,这听起来很酷,但是当我看到这个示例图片时,我对这两者之间的区别感到困惑。
上面的图片可以通过带有自定义适配器的ListView
轻松创build。
那么,在什么情况下应该使用RecyclerView
?
RecyclerView被创build为一个ListView的改进,所以是的,你可以用ListView控件创build一个附加列表,但使用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));
- animation通用列表操作 – animation分离并委托给ItemAnimator 。
还有更多关于RecyclerView,但我认为这些点是主要的。
所以,总结一下,RecyclerView是一个更灵活的处理“列表数据”的控制方式,它遵循代表关注的模式,并且只留下一个任务 – 回收项目。
要使列表视图具有良好的性能,您需要实现持有者模式,这很容易搞砸,特别是当您想用多种不同types的视图填充列表时。
RecyclerView烘焙这种模式,使其更难以搞砸。 它也更加灵活,使得处理不同的布局变得更加容易,而不是像线栅那样的直线。
ListView
是RecyclerView
的祖先。 有很多事情, ListView
要么不做,要么做得不好。 如果你要收集ListView
的缺点,并通过将问题抽象到不同的领域来解决问题,你最终会得到回收者视图。 这里是ListViews的主要问题点:
-
没有为相同的项目types强制执行
View
Reuse(查看ListView
中使用的适配器之一,如果学习getView方法,您将看到没有任何东西阻止程序员为每行创build新视图,即使其中一个通过convertView
variables传入) -
没有防止代价高昂的
findViewById
使用(即使你正在回收视图,如上所述,开发人员可能会调用findViewById
来更新子视图的显示内容,ListViews
中ViewHolder
模式的主要目的是cachingfindViewById
调用。但是,只有当你知道它时才可用,因为它不是平台的一部分) -
只支持垂直滚动显示视图行(Recycler视图并不关心视图的放置位置和移动方式,它被抽象到一个
LayoutManager
中,因此Recycler可以像上面那样支持传统的ListView
,GridView
,但不限GridView
,它可以做更多的事情,但你必须做脚踏实地工作才能实现)。 -
添加/删除的animation不是一个被考虑的用例。 这完全取决于你如何解决这个问题(比较RecyclerView。适配器类通知*方法产品v ListViews得到一个想法)。
简而言之, RecyclerView
是一个更灵活的ListView
,尽pipe你可能需要更多的编码。
RecyclerView
是一个新的ViewGroup,准备以类似的方式渲染任何基于适配器的视图。 它被认为是ListView and GridView
的inheritance者,可以在latest support-v7 version
find它。RecyclerView
开发考虑到可扩展性 ,所以可以创build任何你能想到的布局,但不是没有一点痛苦的剂量。
答案取自安东尼奥·莱瓦
compile 'com.android.support:recyclerview-v7:27.0.0'
RecyclerView
的确是一个比ListView
powerful view
。 有关更多详细信息,请访问此页面 。
主要优势:
ViewHolder
在ListView
默认不可用。 我们将在getView()
显式创build。 RecyclerView
具有内置的Viewholder
。
在这里input代码在整个线程完成之后,
如果ListView适合你,没有理由迁移。 如果您正在编写新的用户界面,那么使用RecyclerView可能会更好。
RecylerView具有内置的ViewHolder,不需要像在ListView中那样实现我们自己的。 它也支持特定索引的通知
像animation添加或删除项目的东西已经在RecyclerView中实现,而无需执行任何操作
我们可以将一个布局pipe理器与一个RecyclerView关联起来,这可以用来获取recycleview中的随机视图,而这是ListView的限制。在一个ListView中,唯一可用的视图types是垂直的ListView。 甚至没有官方的方式来实现水平的ListView。 现在使用RecyclerView,我们可以有一个
i)LinearLayoutManager – 支持垂直和水平列表,ii)StaggeredLayoutManager – 支持Pinterest,像交错列表,iii)GridLayoutManager – 支持在Gallery应用程序中看到的显示网格。
而最好的是,我们可以按照我们的要求dynamic地做所有这些事情。
我认为他们的主要和最大的区别是ListView
在创build或放置时查找物品的位置,另一方面RecyclerView
查找物品的types。 如果有另一个项目使用相同的types创buildRecyclerView
不会再创build它。 它询问第一个适配器,然后要求回收池,如果回收池说“是的,我已经创build了一个类似的types”,那么RecyclerView
不会尝试创build相同的types。 ListView
没有这种池化机制。
在我看来, RecyclerView
是为了解决listviews中使用的回收模式的问题,因为它使开发人员的生活变得更加困难。 所有其他你可以处理更多或更less。 例如,我使用相同的适配器的ListView
和GridView
它并不重要在这两个视图的getView
, getItemCount
, getTypeCount
使用,所以它是一样的。 如果具有ListAdapter
ListView
或具有网格适配器的GridView
已经为您工作,则不需要RecyclerView
。 如果你已经在你的列表视图中正确实现了ViewHolder
模式,那么你将不会看到比RecycleView
什么大的改进。
我使用了RecyclerView
并且仍然喜欢ListView
。
-
当然,他们都使用
ViewHolders
,所以这不是一个好处。 -
RecyclerView
编码更困难。 -
RecyclerView
不包含页眉和页脚,所以它是一个负数。 -
ListView
不需要创buildViewHolder。 如果你想有一个列表或子标题列表,那么创build独立的项目(没有ViewHolder)是一个好主意,这很容易,不需要单独的类。
除了上述差异之外,还有几点:
-
RV将视图创build和数据绑定分开来查看。 在LV中,在将数据绑定到它之前,您需要检查convertView是否为null。 因此,在RV的情况下,只有在需要时才会创build视图,但在LV的情况下,可能会错过Convertview的检查,并且每次都会创build视图。
-
在GridManager和List之间切换更容易。
-
即使只有单个项目被更改,也不需要通知和更新所有项目。
-
一个LV必须实现视图caching。 它在RV中默认提供。 (视图caching和回收之间有区别)
-
在RV的情况下非常容易的项目animation。
- 您可以使用一个接口来提供一个点击监听器。 我也使用这种技术与ListViews。
- 没有分隔线:只需在你的行中添加一个宽度为match_parent,高度为1dp的视图,并给它一个背景色。
- 只需使用StateListselect器作为行背景。
- 在ListViews中也可以避免使用addHeaderView:只需将Header放在View的外面。
所以,如果效率是你关心的话,是的,用RecyclerViewreplaceListView是一个好主意。
简单的答案:你应该使用RecyclerView的情况下,你想显示很多项目,并且它们的数量是dynamic的。 只有在项目数量始终相同且仅限于屏幕大小的情况下,才能使用ListView。
你觉得这很难,因为你正在考虑Android库。
今天有很多选项可以帮助您构build自己的适配器,从而可以轻松构build可以select,重新sorting,使用animation,分隔符,添加页脚,标题等的dynamic项目列表和网格。
不要害怕,试试RecyclerView,你可以开始喜欢它在ListView和RecyclerView中从网上下载100个项目的列表(如facebook的新闻),你会看到UX(用户经验),当您尝试滚动时,testing应用程序可能会停止,甚至可以做到这一点。
我build议你检查这两个库来制作简单的适配器:
由mikepenz提供的FastAdapter
灵活适配器由davideas