首页 文章

RecyclerView与ListView

提问于
浏览
242

来自android开发人员(Creating Lists and Cards):

RecyclerView小部件是ListView的更高级和灵活的版本 .

好吧,这听起来很酷,但是当我看到这个示例图片时,我对两者之间的区别感到困惑 .

enter image description here

使用自定义适配器 ListView 可以轻松创建上面的图片 .

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

13 回答

  • 13

    RecyclerView是作为ListView改进创建的,所以是的,您可以使用ListView控件创建附加列表,但使用RecyclerView更容易:

    • Reuses cells while scrolling up/down - 这可以通过在listView适配器中实现View Holder来实现,但它是可选的,而在RecycleView中它是编写适配器的默认方式 .

    • Decouples list from its container - 这样您就可以在运行时轻松地将列表项放在不同的容器(linearLayout,gridLayout)中并设置 LayoutManager .

    例:

    mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    //or
    mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
    
    • Animates common list actions - 动画被解耦并委托给 ItemAnimator .

    有关RecyclerView的更多信息,但我认为这些是主要的 .

    因此,总而言之,RecyclerView是一个更灵活的控制,用于处理“列表数据”,遵循关注委托模式,并为自己留下一个任务 - 回收项目 .

  • 3

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

    RecyclerView将这种模式融入其中,使其变得更加困难 . 它也更灵活,可以更轻松地处理不同的线性布局,如网格 .

  • 2

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

    • 没有强制执行 View 重用相同的项目类型(查看 ListView 中使用的其中一个适配器,如果您研究getView方法,您将看到没有任何东西阻止程序员为每一行创建一个新视图,即使一个通过 convertView 变量传入)

    • 没有阻止代价高昂 findViewById 使用(即使您正在回收上面提到的视图,开发人员也可以调用 findViewById 来更新子视图的显示内容. ListViewsViewHolder 模式的主要目的是缓存 findViewById 电话 . 但是只有当你知道它时它才可用,因为它根本不是平台的一部分)

    • 仅支持带有行显示视图的垂直滚动(回收器视图不会被抽象为 LayoutManager . 因此,回收器可以支持如上所示的传统 ListView ,以及 GridView 之类的东西,但不限于此,它不限于此,它可以做更多,但你必须做编程脚工作,以实现它) .

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

    简而言之 RecyclerView 是一个更灵活的 ListView ,虽然你可能需要做更多的编码 .

  • 3

    RecyclerView是一个新的ViewGroup,它准备以类似的方式呈现任何基于适配器的视图 . 它被认为是ListView和GridView的后继者,它可以在最新的support-v7版本中找到 . RecyclerView在开发时考虑了可扩展性,因此可以创建您能想到的任何类型的布局,但不能没有一点点痛苦的剂量 .

    答案取自Antonio leiva

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

    RecyclerView 确实是 powerful view 而不是 ListView . 有关详细信息,请访问This page .

  • 2

    以下是RecyclerView和ListView之间的几个关键点/差异 . 明智地接听电话 .

    如果ListView适合您,则没有理由进行迁移 . 如果您正在编写新的UI,那么使用RecyclerView可能会更好 . RecylerView内置了ViewHolder,不需要在listView中实现我们自己的类似 . 它支持特定索引的通知以及动画添加或删除项目的内容已在RecyclerView中实现,无需您执行任何操作我们可以将布局管理器与RecyclerView关联,这可用于在recycleview中获取随机视图这是ListView中的限制在ListView中,唯一可用的视图类型是垂直ListView . 甚至没有官方的方法来实现水平ListView . 现在使用RecyclerView,我们可以有i)LinearLayoutManager - 它支持垂直和水平列表,ii)StaggeredLayoutManager - 支持Pinterest,如交错列表,iii)GridLayoutManager - 支持显示网格如图库应用程序中所示 . 最棒的是我们可以根据需要动态完成所有这些操作 .

  • 321

    主要优势:

    ViewHolderListView 中默认不可用 . 我们将在 getView() 内明确创建 . RecyclerView 内置了 Viewholder .

  • 20

    我认为它们的主要和最大区别在于 ListView 在创建或放置项目时查找项目的位置,另一方面 RecyclerView 查找项目的类型 . 如果有另一个使用相同类型创建的项目 RecyclerView 不再创建它 . 它询问第一个适配器,然后询问Recycpool,如果回收池说"yeah I've created a type similar to it",那么 RecyclerView 不会尝试创建相同的类型 . ListView 没有这种池化机制 .

  • 1

    除上述差异外,还有以下几点:

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

    • 使用LayoutManager在网格和列表之间切换更容易 .

    • 即使只更改了单个项目,也无需通知和更新所有项目 .

    • 必须在LV的情况下实现视图缓存 . 默认情况下,它在RV中提供 . (视图缓存n回收之间存在差异 . )

    • RV的非常简单的项目动画 .

  • 1

    在我看来 RecyclerView 是为了解决listviews中使用的循环模式的问题,因为它使开发人员的生活变得更加困难 . 所有其他你可以或多或少地处理 . 例如,我使用相同的适配器 ListViewGridView 在两个视图中都无关紧要 getViewgetItemCountgetTypeCount ,所以它是相同的 . 如果 ListViewListAdapter 或带有网格适配器的 GridView 已经在为您工作,则不需要 RecyclerView . 如果您在listviews中正确实现了 ViewHolder 模式,那么您将看不到 RecycleView 的任何重大改进 .

  • 15

    我用 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'更容易,不需要单独的类 .

  • 0
    • 您可以使用界面提供单击侦听器 . 我也将这种技术与ListViews一起使用 .

    • 没有分隔符:只需在行中添加一个宽度为match_parent且高度为1dp的视图,并为其指定背景颜色 .

    • 只需使用StateList选择器作为行背景 .
      在ListViews中也可以避免

    • addHeaderView:只需将Header放在View之外 .

    因此,如果您关心效率,那么是的,用RecyclerView替换ListView是个好主意 .

  • 33

    RecyclerView优于listview的优势:

    • 默认包含ViewHolder .

    • 简易动画 .

    • 支持水平,网格和交错布局

    listView over recyclerView的优点:

    • 易于添加分隔符 .

    • 可以将内置的arrayAdapter用于简单的普通列表

    • 支持页眉和页脚 .

    • 支持OnItemClickListner .

  • 35

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

    你发现它更难,因为你只考虑Android库 .

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

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

    我建议你检查这两个库来制作简单的适配器:

    FastAdapter by mikepenz

    FlexibleAdapter by davideas

相关问题