RecyclerView与ListView

从android开发者( 创build列表和卡片 ):

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

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

在这里输入图像描述

上面的图片可以通过带有自定义适配器的ListView轻松创build。

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

RecyclerView被创build为一个ListView的改进,所以是的,你可以用ListView控件创build一个附加列表,但使用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. animation通用列表操作 – animation分离并委托给ItemAnimator

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

所以,总结一下,RecyclerView是一个更灵活的处理“列表数据”的控制方式,它遵循代表关注的模式,并且只留下一个任务 – 回收项目。

要使列表视图具有良好的性能,您需要实现持有者模式,这很容易搞砸,特别是当您想用多种不同types的视图填充列表时。

RecyclerView烘焙这种模式,使其更难以搞砸。 它也更加灵活,使得处理不同的布局变得更加容易,而不是像线栅那样的直线。

ListViewRecyclerView的祖先。 有很多事情, ListView要么不做,要么做得不好。 如果你要收集ListView的缺点,并通过将问题抽象到不同的领域来解决问题,你最终会得到回收者视图。 这里是ListViews的主要问题点:

  • 没有为相同的项目types强制执行View Reuse(查看ListView中使用的适配器之一,如果学习getView方法,您将看到没有任何东西阻止程序员为每行创build新视图,即使其中一个通过convertViewvariables传入)

  • 没有防止代价高昂的findViewById使用(即使你正在回收视图,如上所述,开发人员可能会调用findViewById来更新子视图的显示内容, ListViewsViewHolder模式的主要目的是cachingfindViewById调用。但是,只有当你知道它时才可用,因为它不是平台的一部分)

  • 只支持垂直滚动显示视图行(Recycler视图并不关心视图的放置位置和移动方式,它被抽象到一个LayoutManager中,因此Recycler可以像上面那样支持传统的ListViewGridView ,但不限GridView ,它可以做更多的事情,但你必须做脚踏实地工作才能实现)。

  • 添加/删除的animation不是一个被考虑的用例。 这完全取决于你如何解决这个问题(比较RecyclerView。适配器类通知*方法产品v ListViews得到一个想法)。

简而言之, RecyclerView是一个更灵活的ListView ,尽pipe你可能需要更多的编码。

RecyclerView是一个新的ViewGroup,准备以类似的方式渲染任何基于适配器的视图。 它被认为是ListView and GridView的inheritance者,可以在latest support-v7 versionfind它。 RecyclerView开发考虑到可扩展性 ,所以可以创build任何你能想到的布局,但不是没有一点痛苦的剂量。

答案取自安东尼奥·莱瓦

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

RecyclerView的确是一个比ListView powerful view 。 有关更多详细信息,请访问此页面 。

主要优势:

ViewHolderListView默认不可用。 我们将在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。 例如,我使用相同的适配器的ListViewGridView它并不重要在这两个视图的getViewgetItemCountgetTypeCount使用,所以它是一样的。 如果具有ListAdapter ListView或具有网格适配器的GridView已经为您工作,则不需要RecyclerView 。 如果你已经在你的列表视图中正确实现了ViewHolder模式,那么你将不会看到比RecycleView什么大的改进。

我使用了RecyclerView并且仍然喜欢ListView

  1. 当然,他们都使用ViewHolders ,所以这不是一个好处。

  2. RecyclerView编码更困难。

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

  4. ListView不需要创buildViewHolder。 如果你想有一个列表或子标题列表,那么创build独立的项目(没有ViewHolder)是一个好主意,这很容易,不需要单独的类。

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

  1. RV将视图创build和数据绑定分开来查看。 在LV中,在将数据绑定到它之前,您需要检查convertView是否为null。 因此,在RV的情况下,只有在需要时才会创build视图,但在LV的情况下,可能会错过Convertview的检查,并且每次都会创build视图。

  2. 在GridManager和List之间切换更容易。

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

  4. 一个LV必须实现视图caching。 它在RV中默认提供。 (视图caching和回收之间有区别)

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

  1. 您可以使用一个接口来提供一个点击监听器。 我也使用这种技术与ListViews。
  2. 没有分隔线:只需在你的行中添加一个宽度为match_parent,高度为1dp的视图,并给它一个背景色。
  3. 只需使用StateListselect器作为行背景。
  4. 在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