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
,内存增长。 然后我用RecyclerView
replaceListView
。 编码不仅更加困难,而且导致比ListView
更多的内存使用。 至less在我的项目中
在另一个活动中,我使用了EditText's
复杂列表。 在其中一些input法可能会有所不同,也可以应用TextWatcher
。 如果我使用ViewHolder
,如何在滚动期间replaceTextWatcher
? 所以,我使用了一个没有ViewHolder
的ListView
,它工作。