【发布时间】:2017-04-20 14:57:53
【问题描述】:
Android 上的“Recycleview”和“Listview”有什么区别?
Android中Recycleview和Listview的确切含义。
【问题讨论】:
标签: android android-layout listview
Android 上的“Recycleview”和“Listview”有什么区别?
Android中Recycleview和Listview的确切含义。
【问题讨论】:
标签: android android-layout listview
ListView 类有点太重了——它有很多责任。每当我们必须处理列表时,例如以某种方式对其进行配置,唯一的方法就是通过 ListView 对象或在适配器内部。
我们在 ListView 中讨厌的很多东西在 RecyclerView 中得到了修复或更改。默认情况下效率更高,布局是分离的,我们对适配器内部的数据集有更多的可能性。
这些是ListView 和RecyclerView 之间的关键区别:
ViewHolder 模式可以让我们的列表滚动流畅。它存储列表行视图引用,因此,调用findViewById() 方法只发生几次,而不是针对整个数据集和每个bind view。
RecyclerView 的适配器强制我们使用ViewHolder 模式。创建部分(膨胀布局和查找视图)和更新视图分为两种方法 - onCreateViewHolder() 和 onBindViewHolder()。
另一方面,ListView 默认情况下并没有为我们提供这种保护,因此如果不在getView() 方法中实现ViewHolder 模式,我们将在列表中以低效滚动结束.
LayoutManager 负责布局行视图。多亏了这一点,RecyclerView 不必考虑如何定位行视图。这个类让我们有机会选择我们想要显示行视图的方式以及如何滚动列表。例如,如果我们想垂直或水平滚动我们的列表,我们可以选择LinearLayoutManager。对于网格,选择GridLayoutManager比较合适。
以前,使用 ListView,我们只能创建 垂直滚动 列表,因此不够灵活。如果我们想要列表中的网格,我们必须为此选择另一个小部件 - GridView。
ItemDecoration
ItemDecoration 的职责在理论上很简单——为列表行视图添加一些装饰——但在实践中,如果我们想创建一个自定义视图,实现起来就这么简单。在这种情况下,我们应该扩展ItemDecoration 类并实现我们的解决方案。例如,RecyclerView 列表默认情况下在行之间没有分隔符,并且与 Material Design 指南一致。但是,如果我们出于某种原因想要添加分隔线,我们可以使用
DividerItemDecoration 并将其添加到 RecyclerView。
如果我们使用 ListView,我们必须自己找出行装饰。这个小部件没有像 ItemDecoration 这样的帮助类。
我要提到的RecyclerView 的最后但并非最不重要的组成部分是ItemAnimator。正如我们所料,它正在处理行视图动画,如列表出现和消失、添加或删除特定视图等。默认情况下,RecyclerView 的列表动画非常流畅。当然,我们可以通过创建自己的ItemAnimator 来改变这一点,这也不是那么容易。为了更容易,我们应该扩展SimpleItemAnimator 类并实现我们需要的方法(只需将动画添加到 ViewHolder 的视图中)。
老实说,在 ListView 上实现动画很痛苦。同样,我们必须弄清楚我们想如何处理它们。
RecyclerView 的适配器上有几个很酷的通知器。我们仍然可以使用notifyDataSetChanged(),但也有一些用于特定列表元素,例如notifyItemInserted()、notifyItemRemoved() 甚至notifyItemChanged() 等等。我们应该为实际发生的事情使用最合适的动画,这样正确的动画才能正确触发。
使用ListView,我们只能在适配器上使用notifyDataSetChanged(),然后必须自己处理其余部分,再次。
【讨论】: