来自android开发人员(Creating Lists and Cards):
RecyclerView小部件是ListView的更高级和灵活的版本 .
好吧,这听起来很酷,但是当我看到这个示例图片时,我对两者之间的区别感到困惑 .
使用自定义适配器 ListView
可以轻松创建上面的图片 .
那么,在什么情况下应该使用 RecyclerView
?
来自android开发人员(Creating Lists and Cards):
RecyclerView小部件是ListView的更高级和灵活的版本 .
好吧,这听起来很酷,但是当我看到这个示例图片时,我对两者之间的区别感到困惑 .
使用自定义适配器 ListView
可以轻松创建上面的图片 .
那么,在什么情况下应该使用 RecyclerView
?
13 回答
RecyclerView是作为ListView改进创建的,所以是的,您可以使用ListView控件创建附加列表,但使用RecyclerView更容易:
Reuses cells while scrolling up/down - 这可以通过在listView适配器中实现View Holder来实现,但它是可选的,而在RecycleView中它是编写适配器的默认方式 .
Decouples list from its container - 这样您就可以在运行时轻松地将列表项放在不同的容器(linearLayout,gridLayout)中并设置 LayoutManager .
例:
有关RecyclerView的更多信息,但我认为这些是主要的 .
因此,总而言之,RecyclerView是一个更灵活的控制,用于处理“列表数据”,遵循关注委托模式,并为自己留下一个任务 - 回收项目 .
对于具有良好性能的列表视图,您需要实现持有者模式,这很容易搞乱,特别是当您想要使用几种不同类型的视图填充列表时 .
RecyclerView将这种模式融入其中,使其变得更加困难 . 它也更灵活,可以更轻松地处理不同的线性布局,如网格 .
ListView
是RecyclerView
的祖先 . 有很多事情要么没有做好,要么做得不好ListView
. 如果你要收集ListView
的缺点并通过将问题抽象到不同的域来解决问题,那么你最终会得到像回收者视图这样的东西 . 以下是ListViews的主要问题:没有强制执行
View
重用相同的项目类型(查看ListView
中使用的其中一个适配器,如果您研究getView方法,您将看到没有任何东西阻止程序员为每一行创建一个新视图,即使一个通过convertView
变量传入)没有阻止代价高昂
findViewById
使用(即使您正在回收上面提到的视图,开发人员也可以调用findViewById
来更新子视图的显示内容.ListViews
中ViewHolder
模式的主要目的是缓存findViewById
电话 . 但是只有当你知道它时它才可用,因为它根本不是平台的一部分)仅支持带有行显示视图的垂直滚动(回收器视图不会被抽象为
LayoutManager
. 因此,回收器可以支持如上所示的传统ListView
,以及GridView
之类的东西,但不限于此,它不限于此,它可以做更多,但你必须做编程脚工作,以实现它) .添加/删除的动画不是考虑的用例 . 完全取决于你如何解决这个问题(比较RecyclerView . 适配器类通知*方法产品v.ListViews以获得一个想法) .
简而言之
RecyclerView
是一个更灵活的ListView
,虽然你可能需要做更多的编码 .答案取自Antonio leiva
RecyclerView
确实是 powerful view 而不是ListView
. 有关详细信息,请访问This page .以下是RecyclerView和ListView之间的几个关键点/差异 . 明智地接听电话 .
主要优势:
ViewHolder
在ListView
中默认不可用 . 我们将在getView()
内明确创建 .RecyclerView
内置了Viewholder
.我认为它们的主要和最大区别在于
ListView
在创建或放置项目时查找项目的位置,另一方面RecyclerView
查找项目的类型 . 如果有另一个使用相同类型创建的项目RecyclerView
不再创建它 . 它询问第一个适配器,然后询问Recycpool,如果回收池说"yeah I've created a type similar to it",那么RecyclerView
不会尝试创建相同的类型 .ListView
没有这种池化机制 .除上述差异外,还有以下几点:
RV将视图创建和数据绑定分离到视图 . 在LV中,您需要在将数据绑定到它之前检查convertView是否为null以创建视图 . 因此,在RV的情况下,视图将仅在需要时创建,但是在LV的情况下,可能会错过对convertview的检查并且每次都会创建视图 .
使用LayoutManager在网格和列表之间切换更容易 .
即使只更改了单个项目,也无需通知和更新所有项目 .
必须在LV的情况下实现视图缓存 . 默认情况下,它在RV中提供 . (视图缓存n回收之间存在差异 . )
RV的非常简单的项目动画 .
在我看来
RecyclerView
是为了解决listviews中使用的循环模式的问题,因为它使开发人员的生活变得更加困难 . 所有其他你可以或多或少地处理 . 例如,我使用相同的适配器ListView
和GridView
在两个视图中都无关紧要getView
,getItemCount
,getTypeCount
,所以它是相同的 . 如果ListView
与ListAdapter
或带有网格适配器的GridView
已经在为您工作,则不需要RecyclerView
. 如果您在listviews中正确实现了ViewHolder
模式,那么您将看不到RecycleView
的任何重大改进 .我用
RecyclerView
做了一点工作,但仍然更喜欢ListView
.当然,他们都使用
ViewHolders
,所以这不是一个优势 .A
RecyclerView
在编码方面更加困难 .A
RecyclerView
不是't contain a header and footer, so it' s减号 .A
ListView
没有't require to make a ViewHolder. In cases where you want to have a list with sections or subheaders it would be a good idea to make independent items (without a ViewHolder), it'更容易,不需要单独的类 .您可以使用界面提供单击侦听器 . 我也将这种技术与ListViews一起使用 .
没有分隔符:只需在行中添加一个宽度为match_parent且高度为1dp的视图,并为其指定背景颜色 .
只需使用StateList选择器作为行背景 .
在ListViews中也可以避免
addHeaderView:只需将Header放在View之外 .
因此,如果您关心效率,那么是的,用RecyclerView替换ListView是个好主意 .
RecyclerView优于listview的优势:
默认包含ViewHolder .
简易动画 .
支持水平,网格和交错布局
listView over recyclerView的优点:
易于添加分隔符 .
可以将内置的arrayAdapter用于简单的普通列表
支持页眉和页脚 .
支持OnItemClickListner .
简单的答案:您应该在想要显示大量项目的情况下使用RecyclerView,并且它们的数量是动态的 . 仅当项目数始终相同且仅限于屏幕大小时,才应使用ListView .
你发现它更难,因为你只考虑Android库 .
今天有很多选项可以帮助您构建自己的适配器,从而可以轻松构建动态项目的列表和网格,您可以选择,重新排序,使用动画,分隔符,添加页脚, Headers 等等 .
不要害怕并尝试使用RecyclerView,你可以开始喜欢它在ListView和RecyclerView中制作从网上下载的100个项目列表(如facebook新闻),你会看到UX的不同之处(用户)经验)当你尝试滚动时,测试应用程序可能会在你甚至可以做之前停止 .
我建议你检查这两个库来制作简单的适配器:
FastAdapter by mikepenz
FlexibleAdapter by davideas