我最近遇到了 Android 5.0 发布的 android RecyclerView
,似乎 RecyclerView
只是一个封装的传统 ListView
,其中包含 ViewHolder 模式,它促进了视图的重用,而不是创建它每一次。
使用 RecyclerView
的其他好处是什么?如果两者在性能方面具有相同的效果,为什么更喜欢 RecyclerView ?
编辑
我发现有人问过类似的问题,但答案都不是结论性的,在这里添加它们以备记录。
Should we use RecyclerView to replace ListView?
RecyclerView
速度更快,功能更丰富,API 更好。 RecyclerView
中已经实现了诸如动画添加或删除项目之类的功能,您无需执行任何操作。毫无疑问,把你的 ListView
扔进垃圾桶,RecyclerView
就是来抢戏的。
使用 RecycleView
的另一个好处是动画,它可以在两行代码中完成
RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator();
recyclerView.setItemAnimator(itemAnimator);
但小部件仍然是原始的,例如您不能创建页眉和页脚。
好吧,稍微挖掘了一下,我在 RecycleView
上从 Bill Philips article 那里找到了这些宝石
RecyclerView 可以做的比 ListView 更多,但是 RecyclerView 类本身的职责比 ListView 少。开箱即用,RecyclerView 没有: 在屏幕上定位项目 动画视图 处理除滚动之外的任何触摸事件 所有这些东西都被烘焙到 ListView 中,但是 RecyclerView 使用协作者类来代替这些工作。您创建的 ViewHolders 也更强大。它们是 RecyclerView.ViewHolder 的子类,它有一堆 RecyclerView 使用的方法。 ViewHolders 知道他们当前绑定到哪个位置,以及哪些项目 ID(如果有的话)。在这个过程中,ViewHolder 被封为爵士。过去,ListView 的工作是保留整个项目视图,而 ViewHolder 只保留其中的一小部分。现在,ViewHolder 在 ViewHolder.itemView 字段中保留了所有内容,该字段在 ViewHolder 的构造函数中为您分配。
更多来自 Bill Phillip's 文章(去阅读吧!),但我认为指出以下内容很重要。
在 ListView 中,关于如何处理点击事件存在一些歧义:应该由单个视图处理这些事件,还是 ListView 应该通过 OnItemClickListener 处理它们?但是,在 RecyclerView 中,ViewHolder 处于一个明确的位置,可以充当处理这些细节的行级控制器对象。我们之前看到 LayoutManager 处理定位视图,而 ItemAnimator 处理它们的动画。 ViewHolder 是最后一块:它负责处理 RecyclerView 显示的特定项目上发生的任何事件。
我使用带有 Glide 图像加载器的 ListView
,内存增长。然后我将 ListView
替换为 RecyclerView
。它不仅编码更困难,而且比ListView
占用更多的内存。至少,在我的项目中。
在另一个活动中,我使用了带有 EditText's
的复杂列表。在其中一些中,输入法可能会有所不同,也可以应用 TextWatcher
。如果我使用 ViewHolder
,如何在滚动过程中替换 TextWatcher
?因此,我使用了没有 ViewHolder
的 ListView
,它可以工作。
TextWatcher
。可能你是对的,但我无法检查出来。
在向上/向下滚动时重用单元格 - 这可以通过在 listView 适配器中实现 View Holder 来实现,但它是可选的,而在 RecycleView 中它是编写适配器的默认方式。
将列表与其容器分离 - 因此您可以在运行时通过设置 LayoutManager 轻松地将列表项放入不同的容器(linearLayout、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。
RecyclerView还有很多,但我认为这几点是主要的。
布局管理器
i) LinearLayoutManager - 支持垂直和水平列表,
ii) StaggeredLayoutManager - 支持 Pinterest 之类的交错列表,
iii) GridLayoutManager - 支持在 Gallery 应用程序中显示网格。
最好的事情是我们可以根据需要动态地完成所有这些工作。
RecyclerView 是作为 ListView 改进创建的,所以是的,您可以使用 ListView 控件创建附加列表,但使用 RecyclerView 更容易,因为它:
在向上/向下滚动时重用单元格:这可以通过在 ListView 适配器中实现 View Holder 来实现,但它是可选的,而在 RecycleView 中它是编写适配器的默认方式。将列表与其容器分离:因此您可以在运行时通过设置 LayoutManager 轻松地将列表项放入不同的容器(linearLayout、gridLayout)中。
mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
动画常见列表动作:动画被解耦并委托给 ItemAnimator。 RecyclerView还有很多,但我认为这几点是主要的。
因此,总而言之,RecyclerView 是一种更灵活的控件,用于处理“列表数据”,它遵循关注委托的模式,并且只为自己留下一个任务——回收项目。
如果您使用 RecycleView,首先您需要更多的设置工作。你需要花更多的时间来设置简单的Item onclick、边框、触摸事件和其他简单的东西。但最终产品将是完美的。
所以决定权在你。我建议,如果您设计像电话簿加载这样的简单应用程序,只需单击项目就足够了,您可以实现列表视图。但是,如果您设计像社交媒体主页那样无限滚动。项目之间有几种不同的装饰,对单个项目的控制比使用回收视图要多。
HeaderViewListAdapter
中并在后台添加标题支持。有了RecyclerView
,您就可以掌控一切。