我最近偶然发现了 Android 5.0发布的机器人 RecyclerView,看起来 RecyclerView只是一个封装的传统 ListView,其中加入了 ViewHolder 模式,这促进了视图的重用,而不是每次都创建它。
RecyclerView
ListView
使用 RecyclerView的其他好处是什么? 如果两者在性能方面具有相同的效果,为什么会有人更喜欢回收视图呢?
剪辑
我发现人们也提出过类似的问题,但是答案并不是决定性的。
回收视图与列表视图
我们应该使用回收视图来代替列表视图吗?
为什么回收视图没有 onitemclickListener () ? 回收视图和 Listview 有什么不同?
使用 RecycleView的另一个好处是动画,它可以在两行代码中完成
RecycleView
RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator(); recyclerView.setItemAnimator(itemAnimator);
但是小部件仍然是原始的,例如,你不能创建 标题和 页脚。
好吧,稍微挖掘一下,我发现了这些宝石从比尔飞利浦 文章的 RecycleView
回收视图可以执行比 ListView 更多的操作,但是回收视图类 它本身的责任比 ListView 少, 但“回收视点”没有: 在屏幕上定位项目 动画视图 处理除滚动之外的任何触摸事件 所有这些东西都被加入到 ListView 中,但回收视图使用 合作者类来做这些工作。 您创建的 ViewHolder 也更强大 RecyclerView.ViewHolder,其中包含许多方法 RecyclerView ViewHolders知道它们当前绑定到哪个位置,如 以及哪个项目的 id (如果你有的话)。在这个过程中,ViewHolder 曾经是 ListView 的工作就是保持 整个项目视图,和 ViewHolder只持有它的一小部分。 现在,ViewHolder 在 ViewHolder.itemView中保留了所有的内容 字段,该字段在 ViewHolder 的构造函数中为您分配。
回收视图可以执行比 ListView 更多的操作,但是回收视图类 它本身的责任比 ListView 少, 但“回收视点”没有:
所有这些东西都被加入到 ListView 中,但回收视图使用 合作者类来做这些工作。
您创建的 ViewHolder 也更强大 RecyclerView.ViewHolder,其中包含许多方法 RecyclerView ViewHolders知道它们当前绑定到哪个位置,如 以及哪个项目的 id (如果你有的话)。在这个过程中,ViewHolder 曾经是 ListView 的工作就是保持 整个项目视图,和 ViewHolder只持有它的一小部分。
RecyclerView.ViewHolder
ViewHolders
ViewHolder
现在,ViewHolder 在 ViewHolder.itemView中保留了所有的内容 字段,该字段在 ViewHolder 的构造函数中为您分配。
ViewHolder.itemView
更多来自 比尔 · 菲利普的的文章(去读吧!) ,但我认为指出以下内容很重要。
在 ListView 中,关于如何处理单击事件存在一些模糊性: 单个视图应该处理这些事件,还是 ListView 应该通过 OnItemClickListener 处理它们?但是,在回收视图中,ViewHolder 显然可以充当处理这些细节的行级控制器对象。 我们之前看到 LayoutManager 处理定位视图,而 ItemAnimator 处理动画视图。ViewHolder 是最后一部分: 它负责处理发生在回收视图显示的特定项上的任何事件。
在 ListView 中,关于如何处理单击事件存在一些模糊性: 单个视图应该处理这些事件,还是 ListView 应该通过 OnItemClickListener 处理它们?但是,在回收视图中,ViewHolder 显然可以充当处理这些细节的行级控制器对象。
我们之前看到 LayoutManager 处理定位视图,而 ItemAnimator 处理动画视图。ViewHolder 是最后一部分: 它负责处理发生在回收视图显示的特定项上的任何事件。
我使用了带有 Glide 图像加载程序的 ListView,具有内存增长。然后我用 RecyclerView代替了 ListView。它不仅编码更困难,而且比 ListView占用更多的内存。至少在我的项目里是这样。
在另一个活动中,我使用了 EditText's的复杂列表。在其中一些输入方法可能会有所不同,也可以应用 TextWatcher。如果我使用了 ViewHolder,那么在滚动过程中如何替换 TextWatcher?所以,我使用了一个没有 ViewHolder的 ListView,它工作了。
EditText's
TextWatcher
当向上/向下滚动 时重用单元格——这在 listView 适配器中实现 View Holder 时是可能的,但是这是一个可选的事情,而在回收视图中这是编写适配器的默认方式。
将 list 从它的容器 中分离出来——这样你就可以在运行时通过设置 LayoutManager 轻松地将列表项放到不同的容器中(线性布局,gridLayout)。
例如:
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); //or mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3));
动画公共列表操作。
动画被解耦并委托给 ItemAnimator。
ItemAnimator
还有更多关于回收视图的内容,但我认为这些是主要的观点。
布局管理器
I) LinearLayoutManager-它同时支持垂直和水平列表,
Ii) StaggeredLayoutManager-支持 Pinterest 的交错列表,
Iii) GridLayoutManager-支持在 Gallery 应用程序中显示网格。
最好的事情是我们可以做所有这些动态,因为我们想要的。
回收视图是作为 ListView 的改进创建的,所以是的,您可以使用 ListView 控件创建一个附加列表,但是使用回收视图更容易:
当向上/向下滚动 时重用单元格: 在 ListView 适配器中实现 View Holder 是可能的,但是这是一个可选的事情,而在回收视图中这是编写适配器的默认方式。
从容器 中分离列表: 这样你可以在运行时通过设置 LayoutManager 轻松地将列表项放到不同的容器中(线性布局,gridLayout)。
M召回视图 = (召回视图) findViewById (R.id.my _ 召回视图) ; SetLayoutManager (新的 LinearLayoutManager (this)) ; SetLayoutManager (新的 GridLayoutManager (this,2)) ;
因此,总之,对于处理“列表数据”,回收视图是一个更灵活的控件,它遵循关注点委托模式,并且只留给自己一个任务——回收项。
如果您使用回收视图,首先您需要更多的努力来设置。您需要给更多的时间来设置简单的项目上点击,边框,触摸事件和其他简单的事情。但最终产品会是完美的。
所以决定权在你。我建议,如果你设计一些简单的应用程序,比如电话簿加载,点击一下项目就足够了,你可以实现 listview。但是如果你设计像社会媒体主页无限滚动。几个不同的装饰项目之间,更多的控制个别项目比使用回收利用的观点。