RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 604880
Accepted
Heaven
Heaven
Asked:2020-12-18 19:24:32 +0000 UTC2020-12-18 19:24:32 +0000 UTC 2020-12-18 19:24:32 +0000 UTC

ListView 与 RecyclerView

  • 772

不久前,我开始为android编写代码并一直使用ListView,之后我给出了我的代码进行验证,他们告诉我使用ListView“不是camille”,唉,他们没有理由。它们有何根本不同以及 RecyclerView 比 ListView 有何优势?

android
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    ZigZag
    2020-12-20T00:30:30Z2020-12-20T00:30:30Z

    RecyclerView 是一个新的 ViewGroup,准备好被任何使用适配器的视图以相同的方式解释。它应该继承自 ListView 和 GridView。原因之一是 RecyclerView 有一个更可扩展的框架,特别是因为它提供了水平和垂直布局的能力。当您的数据集的项目在运行时根据用户操作或网络事件发生变化时,请使用 RecyclerView。

    RecyclerView 与其前身 Listview 的不同之处主要在于以下特性:

    1) 需要在适配器中使用ViewHolder ——Listview适配器不需要使用ViewHolder模式来提高性能。相反,为 RecyclerView 实现适配器需要使用 ViewHolder 模式;

    2) 自定义项目层- Listview 只能按垂直线性顺序排列项目,并且无法更改。与 Listview 不同,RecyclerView 具有 RecyclerView.Layoutmanager,它允许元素的任何布局,包括水平列表或交错网格;

    3) 简单的元素动画- Listview 不包含任何特殊机制,您可以通过这些机制为元素的添加或删除设置动画。与 Listview 不同, RecyclerView 具有 RecyclerView.ItemAnimator ,它允许您控制动画;

    4) 手动设置数据源- Listview 具有针对各种数据源的适配器,例如分别用于数组和数据库的数组适配器和 CursorAdapter。相比之下,RecyclerView.Adapter 需要自定义实现数据传递到适配器;

    5) 项目的手动装饰- ListView 有 android:divider 来轻松地分隔列表中的项目。与 Listview 不同的是,RecyclerView 有 RecyclerView.ItemDecoration,它提供了更多装饰分区的选项;

    6) 定义一个项目点击- ListView 有一个 AdapterView.OnItemClickListener 接口来绑定点击事件到一个特定的列表项目。与 Listview 不同, RecyclerView 仅支持 RecyclerView.OnItemTouchListener 处理单个点击事件但没有内置触摸控制。

    • 18
  2. pavlofff
    2020-12-18T20:24:17Z2020-12-18T20:24:17Z

    让我们先从这个事实开始吧,RecyclerView虽然widget在视觉上与它相似ListView并且似乎做同样的事情,但它并不是它的直接替代品,直接反对在这里有些不正确。这两个小部件在 Android 应用程序的结构中都有自己的“位置”。

    由于对显示具有许多不同类型的复杂项目及其在列表中的相对位置的RecyclerView适应性不足,因此出现了对小部件的需求。它也有一些技术上的错误计算,这使得它不像我们想要的那样快速和高效。ListViewViewListView

    因此,RecyclerView重用项目的算法在小部件中完全重新设计(使用子类Recycler和一些与重用过程交互的方法),它也成为强制实现一个子类ViewHolder来缓存对View项目的引用并优化设备上的负载. 此外,还为各种优化实施了一些辅助类,这应该会提高性能。值得注意的是,这一切已经让小部件本身的源代码变得如此混乱,以至于要理解它的操作并不是一件容易的事。

    此外,视觉设计子类已经实现,提供了一种更简单的方法来“装饰”这个小部件 - ItemDecoration,ItemAnimator等等LayoutManager,这使得创建真正具有视觉吸引力的列表而无需任何“拐杖”变得容易。还有一些方法可以通过从列表中插入、替换和删除它们来处理单个项目\项目组,而不是更新整个列表ListView,这对响应性和性能有积极影响,它也有动作动画,它删除了这些开发商的杂务。

    然而,也有一些“失望”。widget 没有单独实现的适配器来处理典型数据,任何适配器都需要独立实现,基于RecyclerView.Adapter存根类,项目中点击的监听器也没有实现,也建议自己实现一些理由。

    因此,让我们看一下上面的内容,想象一下我们需要一个文本行中没有任何“装饰”的简单原始列表,例如Spinner(例如,从对话框中的列表中选择一个城市或其他典型任务这样一个微调器不太合适的计划)或侧边栏项目NavigationView和类似的列表显示任务。我们不需要在这样的列表中删除或插入任何东西,我们不需要对其进行装饰或动画处理,而且十几个点的原始内容不需要认真优化。

    很明显,这样一个应用程序中的所有“花里胡哨”RecyclerView不仅不合时宜,而且是额外的负担,而且是必要的东西,比如用于输出简单字符串的现成适配器、现成的标记和点击侦听器完全不存在。结果,不是用三行代码来ListView实现最简单的列表,而是需要编写整个适配器类和标记文件,这有点令人沮丧。

    因此,使用这些小部件的方式存在于不同的层面。RecyclerView对于具有许多元素、动画和视觉设计的“伟大”复杂列表,ListView对于简单的两行列表(可能带有图片)到标准数据集,如 ArrayList、Cursor 等。您需要的一切都已经通过系统本身实现了。

    它们之间的选择可能在于如果您ListView需要重新定义适配器(创建自定义适配器)的平面,那么您应该已经考虑过RecyclerView. 如果没有这种需要,那么可能性RecyclerView就很可能不合适了。

    • 10
  3. ЮрийСПб
    2020-12-18T19:41:29Z2020-12-18T19:41:29Z
    1. RecyclerView 是作为列表小部件的改进和更新版本创建的。
    2. 谷歌建议切换到 RecyclerView 原因来自第 1 点
    3. RecyclerView 有很多额外功能。事物。例如,更详细地告诉适配器如何显示数据变化的能力。对于特定元素,对于一组元素。ListView 只能一次更改所有元素。
    4. RecyclerView 不能在没有 Viewholder 的情况下使用,这提供了许多优点。
    5. 添加/删除/更改数据事件的动画会立即内置到 RecyclerView 中
    6. ETC
    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5