2014-11-04 69 views
207

从Android开发者(Creating Lists and Cards):RecyclerView与ListView控件

的RecyclerView widget是 ListView中的更先进,更灵活的版本。

好吧,这听起来很酷,但是当我看到这个示例图片时,我对这两者之间的差异感到非常困惑。

enter image description here

上面的图片可以很容易地通过用ListView定制适配器创建的。

那么,在什么情况下应该使用RecyclerView

+4

[第一次看到,机器人-recyclerview(http://www.grokkingandroid.com/ first-glance-androids-recyclerview /) – 2014-11-04 06:02:08

+1

@ Dev786:我建议你在这里添加一个评论,详细解释你在这个问题上许多**现有答案中缺少的感受。 – CommonsWare 2017-11-13 11:45:41

回答

280

RecyclerView创建为一个ListView改善,所以是的,你可以创建ListView控件的附表,但使用RecyclerView是因为它更容易:

  1. 重复利用细胞,同时滚动向上/向下 - 这可以通过在listView适配器中实现View Holder来实现,但这是可选的,而在RecycleView中,它是写入适配器的默认方式。

  2. 解耦列表从其容器 - 所以你可以把列表项容易在运行时在不同的容器(LinearLayout中,网格布局)与设置布局管理

实施例:

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); 
mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
//or 
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); 
  • 动画处理共同的列表的动作 - 动画被解耦并委派给ItemAnimator
  • 还有更多关于RecyclerView,但我认为这些点是主要的。

    因此,总结而言,RecyclerView是一种更灵活的控件,用于处理“列表数据”,它遵循关注代表模式并为其自身留下一项任务 - 回收项目。

    +2

    你能解释第二点吗? – 2015-05-21 06:07:12

    +10

    列表视图的主要职责是1.)在给定区域内可视地安排项目,最好是2.)重用项目。 使用RecylerView可以分解成单个职责 - 回收视图回收,并且给定LayoutManager将项目排列在屏幕上。 换句话说,回收视图不知道/关心将物品放置在屏幕上的哪个位置,它只是照顾回收它们。 来自android文档: “通过更改LayoutManager,RecyclerView可用于实现标准垂直滚动列表,统一网格,交错网格,水平滚动集合等。” – daneejela 2015-05-21 10:11:20

    +22

    “向上/向下滚动时重复使用单元格”:As远我知道这是完全错误的因为即使在没有查看者的列表视图中也会发生这种情况。 – Ruban 2016-05-11 14:22:39

    30

    要使列表视图具有良好的性能,您需要实现持有者模式,这很容易搞砸,特别是当您想用多种不同类型的视图填充列表时。

    RecyclerView烘焙这种模式,使其更难以搞砸。它也更加灵活,使得处理不同的布局变得更加容易,不像线栅那样是直线的。

    +4

    是的! ,应该有更多的讨论关于何时*不*使用recyclerview。如果您的行具有基于模型数据动态添加的内容,并且您使用Recycler视图BOOM。 – 2015-08-19 12:27:57

    +1

    您应该可以根据模型数据添加动态内容。您只需要为想要支持的任何类型的内容设置不同的视图。 – CaptRespect 2015-08-31 14:43:23

    19

    RecyclerView是一个新的ViewGroup,它准备以类似的方式呈现任何基于适配器的视图 。它被认为是 的后继ListView and GridView,它可以在 latest support-v7 version中找到。该RecyclerView已经发展 充分考虑扩展,所以它可以创建任何类型的 布局你能想到的,但也不是没有一点疼痛的最屁股 剂量。从Antonio leiva

    compile 'com.android.support:recyclerview-v7:27.0.0' 
    

    RecyclerView采取

    答案确实是一个powerful viewListView。 欲了解更多详情,你可以访问This page

    +3

    我喜欢你的答案中的这句话:**这是Android,所以事情从来都不容易**这对于Android应用程序开发一直存在是正确的,但我认为他们如何设计API也是错误的作为构建Android应用程序的模式。理论上讲,好的设计应该隐藏程序员的所有可能的复杂性(但仍然可以用于高级的),他们通常关心的是业务逻辑,数据和其他算法,而不是处理与UI相关的问题(以及目前存在的更乏味的问题在Android开发中)。 – Hopeless 2016-07-25 02:26:12

    28

    ListViewRecyclerView的祖先。有很多事情,ListView要么没有做,要么做得不好。如果你要收集ListView的缺点,并通过将问题抽象到不同的域来解决问题,那么最终会得到类似于回收者视图的东西。以下是主要问题点与列表视图:

    • 没有强制View回用于同一项目类型(看看那些在ListView使用的适配器之一,如果你研究getView方法,你会看到没有什么能阻止程序员从创建每一行一个新的观点,即使一个通过convertView变量传递)

    • 并没有阻止昂贵findViewById用途(即使你被回收的意见,指出上面有可能为开发者致电findViewById更新子视图的显示内容的主要用途ListViews中的模式用于缓存findViewById调用。但是,只有当您知道它时才可用,因为它不是平台的一部分)

    • 仅支持垂直滚动显示行显示视图(Recycler视图不关心放置视图的位置以及它们如何放置它被抽象成LayoutManager。因此回收站可以像上面那样支持传统的ListView,以及像GridView这样的东西,但它并不局限于此,它可以做更多的事情,但是你必须进行编程足部工作,使其发生)。

    • 添加/删除的动画不是被考虑的用例。完全取决于你如何解决这个问题(比较RecyclerView。Adapter类通知*方法产品v ListViews以获得想法)。

    总之RecyclerView是一种更为灵活的作为在ListView,尽管更多的代码可能需要对您的部分完成。

    12

    主要优势:

    ViewHolder是默认不可用在ListView。我们将在getView()内明确创建。 RecyclerView已内置Viewholder

    2

    在我看来RecyclerView是为了解决listviews中使用的回收模式的问题,因为它让开发人员的生活变得更加困难。 所有其他你可以处理更多或更少。 例如我使用相同的适配器为ListViewGridView这两个视图都没有关系getView,getItemCount,getTypeCount被使用,所以它是相同的。 RecyclerView不需要如果ListViewListAdapterGridView与网格适配器已经为你工作。 如果您在列表视图中正确实施了ViewHolder模式,那么您将看不到比RecycleView有任何大的改进。

    3

    我认为他们的主要和最大区别在于ListView寻找物品在创建或放置时的位置,另一方面RecyclerView寻找物品的类型。如果使用相同类型创建了另一个项目RecyclerView不会再次创建它。它询问第一个适配器,然后询问回收池,如果回收池说“是的,我创建了一个类似于它的类型”,那么RecyclerView不会尝试创建相同的类型。 ListView没有这种池化机制。

    11

    在这里输入代码在整个线程结束之后,

    如果ListView适合你,没有理由迁移。如果你是 编写一个新的用户界面,你可能会更好使用RecyclerView。

    RecylerView具有内置的ViewHolder,不需要像在listView中一样实现我们自己的 。它支持在特定索引通知以及

    似水般的动画添加或移除项目已 在RecyclerView实现的,您无需做任何事情

    我们可以用一个RecyclerView布局管理器相关联,这样可以是 用于在recycleview中获取随机视图,而这是ListView中的限制 在ListView中,唯一可用的视图类型是 垂直ListView。甚至没有官方的方式来实现水平ListView的 。现在用的是RecyclerView,我们可以有一个

    ⅰ)LinearLayoutManager - 支持垂直和水平 列表,ⅱ)StaggeredLayoutManager - 支持Pinterest的像 交错列表,ⅲ)GridLayoutManager - 这支持显示 网格作为可见图库应用。

    最好的事情是,我们可以根据需要动态地完成所有这些工作。

    2

    我工作了一点RecyclerView,仍然更喜欢ListView

    1. 当然,他们都使用ViewHolders,所以这不是一个优势。

    2. A RecyclerView在编码上比较困难。

    3. A RecyclerView不包含页眉和页脚,所以它是一个负数。

    4. A ListView不需要制作ViewHolder。如果你想要一个带有部分或副标题的列表,那么创建独立的项目(没有ViewHolder)是一个好主意,这很容易,并且不需要单独的类。

    +1

    您可以在回收站视图适配器中创建标题和内容端,并且它比listview更灵活。只是很难改变你的头脑listview到recyclerview,但如果你能做到这一点,你会明白我的意思.listview废弃只是去尝试学习recyclerview goodluck – erginduran 2016-09-25 12:55:14

    +2

    @erginduran,我用这两个。 ListView仍然被广泛使用,不被弃用。它也比RecyclerView浪费更少的内存。如果你只想用RecyclerView替换ListView,它不会是一个好主意。 – CoolMind 2016-09-26 06:15:46

    +0

    只是检查为什么这个家伙开发recyclerview?其对listview的改进,对吗?在谷歌播放中有许多旧的库和应用程序,所以你是正确的listview仍然广泛used.just留下旧的东西在过去。检查比较 - > [链接](http://stackoverflow.com/questions/28525112/android-recyclerview-vs-listview-with-viewholder) – erginduran 2016-09-26 18:11:20

    3

    除了以下以上的差异是更少数:

    1. RV分离视图创建和数据的结合,以查看。 在LV中,在将数据绑定到它之前,您需要检查convertView是否为null以创建视图。 因此,在RV的情况下,只有在需要时才会创建视图,但在LV的情况下,可能会错过对convertview的检查,并且每次都会创建视图。

    2. 现在,使用LayoutManager更容易切换网格和列表。

    3. 即使只有单个项目发生更改,也无需通知并更新所有项目。

    4. 一个人必须在LV的情况下实现视图缓存。 默认情况下,它在RV中提供。 (视图缓存n回收有区别。)

    5. 在RV情况下非常容易的项目动画。

    1
    1. 您可以使用一个接口来提供点击收听。我也使用这个 技术与ListViews。
    2. 无分隔线:只需在您的行中添加宽度为 的视图match_parent和1dp的高度并为其指定背景颜色。
    3. 只需使用StateList选择器作为行背景。
    4. 在ListViews中也可以避免使用addHeaderView:只需将 标题放在View外面。

    所以,如果效率是你的顾虑,那么是的,用RecyclerView代替ListView是一个好主意。

    0

    简单的回答:您应该在想要显示大量项目并且它们的数量是动态的情况下使用RecyclerView。只有当项目数量始终相同并且仅限于屏幕大小时,才应使用ListView。

    您发现它更难,因为您只是在考虑Android库。

    今天有很多选项可以帮助您构建自己的适配器,使您可以轻松构建可以选择,重新排序,使用动画,分隔符,添加页脚,标题等的动态项目的列表和网格。

    不要害怕,试试看RecyclerView,你可以开始喜欢它,在ListView和RecyclerView中制作100个从网上下载的项目列表(如facebook新闻),你会看到不同的在UX中(用户体验),当您尝试滚动时,测试应用程序可能会停止,甚至可以执行。

    我建议你检查这两个库的制作容易适配器:

    FastAdapter by mikepenz

    FlexibleAdapter by davideas