1、RecyclerView 初体验:什么是 RecyclerView?为什么用它?与 ListView 的对比

各位同学,咱们今天正式开讲 RecyclerView。说实话,这个控件在 Android 开发里太常见了,几乎每个 App 都离不开它。我刚开始学 Android 那会儿,用的还是 ListView,后来 Google 推出了 RecyclerView,我一开始还觉得「不就是换个名字嘛」,结果一用就回不去了。

好,咱们先搞清楚一个最基本的问题:RecyclerView 到底是什么?

1.1 什么是 RecyclerView?

RecyclerView 是 Android 官方提供的一个高级列表组件,属于 Support Library(现在叫 AndroidX)的一部分。它的核心作用就是——高效地展示大量数据

你想想看,手机屏幕就那么大,能同时显示几十条数据就不错了。但你的数据源可能有几千条甚至几万条。如果每条数据都创建一个 View 对象,内存很快就爆了。RecyclerView 的解决方案很聪明:只创建屏幕可见范围内的 View,滚动时把离开屏幕的 View 回收再利用。这就是它名字里「Recycler」的由来。

核心思想:RecyclerView 通过 ViewHolder 模式 + 回收复用机制,用极少的 View 对象展示海量数据。说白了,就是「一个萝卜一个坑,萝卜走了坑留下,下一个萝卜接着用」。

我举个例子。假设你的手机屏幕能显示 10 条联系人,数据源有 1000 条。RecyclerView 只会创建 10 个左右的 ViewHolder,当你往下滑时,顶部离开屏幕的 ViewHolder 会被回收,然后绑定新的数据,再放到底部显示。整个过程 View 对象数量基本不变,内存开销非常稳定。

1.2 为什么用 RecyclerView?

好,那问题来了:既然 ListView 也能展示列表,为什么 Google 还要推出 RecyclerView?我个人的理解是——ListView 太「死板」了

ListView 能做的事情很有限:垂直滚动列表,每个 item 高度固定,布局方式单一。如果你想做横向滚动、网格布局、瀑布流,ListView 基本就歇菜了。你当然可以自己写一堆代码去适配,但那个工作量……嗯,我当年改过一个瀑布流需求,改到怀疑人生。

RecyclerView 就不一样了。它把「布局」这件事完全抽象出来,交给 LayoutManager 去管。你想垂直滚动?用 LinearLayoutManager。想横向滚动?设置一下方向就行。想网格布局?用 GridLayoutManager。想瀑布流?用 StaggeredGridLayoutManager。每种布局只需要换一个 Manager,代码改动量极小。

个人经验:我在做电商 App 时,首页商品列表需要从单列切换成双列。如果用 ListView,我得重写整个 Adapter。但用 RecyclerView,只需要把 LayoutManager 从 LinearLayoutManager 换成 GridLayoutManager,再改一下 item 布局,半小时搞定。

另外,RecyclerView 的动画支持也是原生自带的。添加、删除、移动 item 时,只需要调用 notifyItemInserted()notifyItemRemoved() 等方法,RecyclerView 会自动播放动画。ListView 要实现同样的效果,你得自己写动画逻辑,而且很容易出现闪烁或位置错乱的问题。

1.3 RecyclerView vs ListView:一张表说清楚

咱们直接上对比表格,这样更直观:

对比维度 RecyclerView ListView
布局方式 通过 LayoutManager 支持线性、网格、瀑布流 仅支持垂直线性列表
ViewHolder 模式 强制使用,性能更好 可选使用,不强制
动画支持 内置 ItemAnimator,开箱即用 需要自己实现动画
数据更新 支持局部刷新(单个 item 增删改) 只能全局刷新(notifyDataSetChanged)
点击事件 没有默认点击监听,需要自己实现 自带 OnItemClickListener
分隔线 通过 ItemDecoration 自定义 通过 android:divider 属性设置
空视图 需要自己处理 支持 setEmptyView()
头/脚视图 需要自己实现(或借助第三方库) 支持 addHeaderView() / addFooterView()
性能 更高,回收复用机制更完善 一般,容易产生卡顿

看到这个表格,你可能会问:RecyclerView 没有默认点击事件,也没有空视图和头脚视图,这不是缺点吗?

嗯,确实。但 Google 的设计理念是——RecyclerView 只做「列表展示」这一件事,其他功能都通过扩展机制来实现。这样做的优点是灵活性极高,你可以按需组合。缺点嘛,就是上手门槛比 ListView 高一点。

避坑指南:我曾经在一个项目里直接用 ListView 的 OnItemClickListener 处理点击,结果列表里混入了 Button 和 CheckBox,点击事件各种冲突,最后不得不重写触摸事件。换成 RecyclerView 后,我改用接口回调的方式处理点击,反而更清晰了。

1.4 知识体系总览

为了让你对 RecyclerView 的整体结构有个直观认识,我画了一张图:

RecyclerView 核心架构 RecyclerView LayoutManager Adapter ItemAnimator ItemDecoration LinearLayoutManager GridLayoutManager StaggeredGridLayoutManager onCreateViewHolder onBindViewHolder getItemCount 添加/删除动画 移动动画 自定义动画 分隔线 间距 分组标签 四大组件各司其职,组合出无限可能

从这张图你可以看到,RecyclerView 的核心由四个组件构成:

  • LayoutManager:负责 item 的布局方式,是 RecyclerView 灵活性的关键
  • Adapter:负责将数据绑定到 ViewHolder 上,是数据与视图的桥梁
  • ItemAnimator:负责 item 的动画效果,让列表变化更自然
  • ItemDecoration:负责 item 的装饰效果,比如分隔线、间距等

这四个组件各司其职,互不干扰。你想改布局?换 LayoutManager。你想改动画?换 ItemAnimator。这种「高内聚低耦合」的设计,正是 RecyclerView 强大的根本原因。

1.5 什么时候该用 RecyclerView?

说了这么多,那是不是所有列表场景都该用 RecyclerView?我个人建议:除非你的列表极其简单(比如设置页面那种固定几行的静态列表),否则一律用 RecyclerView

为什么?因为 RecyclerView 的学习成本虽然比 ListView 高一点,但它的扩展性和性能优势太明显了。你花半天学会 RecyclerView,以后所有列表需求都能搞定。而 ListView 遇到复杂需求就得各种 hack,改来改去反而更浪费时间。

我的建议:新项目直接上 RecyclerView,老项目如果还在用 ListView,遇到需求变更时顺手重构一下。我去年把一个老模块的 ListView 改成 RecyclerView,代码量减少了 30%,性能还提升了不少。

好,这一章咱们把 RecyclerView 的基本概念、为什么用它、以及和 ListView 的对比都讲清楚了。下一章我会带你手写第一个 RecyclerView 示例,从零搭建一个完整的列表页面。到时候你就知道,RecyclerView 用起来其实比想象中简单得多。


公众号:蓝海资料掘金营,微信 deep3321