Android Recyclerview vs ListView with Viewholder

我最近遇到了与Android 5.0一起发布的Android RecycleView ,看起来RecycleView只是一个封装RecycleView传统ListView ,并且包含了ViewHolder模式,它促进了视图的重用,而不是每次都创build它。

使用RecycleView的其他好处是RecycleView ? 如果两者在性能上有相同的效果,为什么要select使用RecycleView?

编辑

我发现有人问过类似的问题,答案也没有定论,把它们加在这里作logging。

Recyclerview vs Listview

我们应该使用RecyclerView来replaceListView吗?

为什么RecyclerView没有onItemClickListener()? 以及如何RecyclerView不同于列表视图?

随着Android Lollipop的到来, RecyclerView正式开始了。 RecyclerView 比ListView强大,灵活,更重要 。 我会尽力给你一个详细的见解。

1)ViewHolder模式

在ListView中,build议使用ViewHolder模式,但从来没有强制。 在使用RecyclerView的情况下,使用RecyclerView.ViewHolder类是必需的。 这是ListView和RecyclerView之间的主要区别之一。

它在RecyclerView中使事情变得复杂一些,但我们在ListView中遇到的很多问题都得到了有效的解决。

2)LayoutManager

这是给RecyclerView带来的另一个重大改进。 在ListView中,唯一可用的视图types是垂直的ListView。 甚至没有官方的方式来实现水平的ListView。

现在使用RecyclerView,我们可以有一个

i) LinearLayoutManager – 支持垂直和水平列表,

ii) StaggeredLayoutManager – 支持Pinterest的交错列表,

iii) GridLayoutManager – 支持在Gallery应用程序中看到的显示网格。

而最好的是,我们可以按照我们的要求dynamic地做所有这些事情。

3)项目animation师

ListView缺乏良好的animation支持,但RecyclerView带来了一个全新的维度。 使用RecyclerView.ItemAnimator类,animation视图变得非常简单和直观。

4)项目装饰

在ListViews的情况下,dynamic装饰项目,如添加边界或分隔线是不容易的。 但是在RecyclerView的情况下, RecyclerView.ItemDecorator类给开发人员提供了巨大的控制权,但是使事情变得更加耗时和复杂。

5)OnItemTouchListener

拦截ListView上的项目点击很简单,这要感谢它的AdapterView.OnItemClickListener接口。 但RecyclerView通过RecyclerView.OnItemTouchListener为开发人员提供了更多的权力和控制权,但是这对开发者来说却是复杂的。

简而言之,RecyclerView比ListView更可定制,并为其开发人员提供了很多控制和权力。

好吧,这么一点点的挖掘,我发现这些比尔飞利浦关于RecycleView 文章

RecyclerView可以做比ListView更多的工作,但RecyclerView类本身的责任比ListViewless。 开箱即用,RecyclerView不会:

  • 将项目定位在屏幕上
  • animation视图
  • 除了滚动之外,还可以处理任何触摸事件

所有这些东西被烘烤到ListView,但RecyclerView使用协作者类来完成这些工作。

您创build的ViewHolders也更加强大。 他们的子类RecyclerView.ViewHolder ,有一堆RecyclerView使用的方法。 ViewHolders知道它们当前绑定的位置,以及哪个项目id(如果有的话)。 在这个过程中, ViewHolder已被ViewHolder爵士。 它曾经是ListView的工作,以保持整个项目视图,而ViewHolder只保留在它的小部分。

现在,ViewHolder在ViewHolder.itemView字段中保留所有的ViewHolder.itemView字段, ViewHolder.itemView字段在ViewHolder的构造函数中为您分配。

使用RecycleView的另一个RecycleView是animation,可以用两行代码完成

 RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator(); recyclerView.setItemAnimator(itemAnimator); 

但小部件仍然是原始的,例如,您不能创build页眉页脚

更多来自比尔·菲利普的文章(阅读它!),但我认为重要的是指出以下内容。

在ListView中,关于如何处理点击事件有一些不明确的地方:各个视图应该处理这些事件,还是ListView应该通过OnItemClickListener处理它们? 但是,在RecyclerView中,ViewHolder处于明确的位置,可以充当处理这些细节的行级控制器对象。

之前我们看到LayoutManager处理定位视图,ItemAnimator处理animation。 ViewHolder是最后一块:它负责处理RecyclerView显示的特定项目上发生的任何事件。

我使用了带有Glide图像加载器的ListView ,内存增长。 然后我用RecyclerViewreplaceListView 。 编码不仅更加困难,而且导致比ListView更多的内存使用。 至less在我的项目中

在另一个活动中,我使用了EditText's复杂列表。 在其中一些input法可能会有所不同,也可以应用TextWatcher 。 如果我使用ViewHolder ,如何在滚动期间replaceTextWatcher ? 所以,我使用了一个没有ViewHolderListView ,它工作。