【基础05】Android UI 绘制知识体系(三)

337 阅读2分钟

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战

上一篇简单介绍了一些基础 View,全是 xml 搭建的,看起来非常简单,今天就开始提高难度,进入「列表」的实现。

列表的特点

列表是 App 中非常常见的 UI 样式,比如微信的对话列表,联系人列表,或者 Bilibili 首页的推荐列表等。列表有两个特性,分别是无限数据量和重复的 View,

表面上看,列表就是相同样式 View 的复制,好像用 CV 大法就能实现。但实际上 Android 提供了专门处理列表的一个 ViewGroup —— RecyclerView,这是因为对于 Android 来说,实现一个列表最大的挑战其实是性能。

这是第一次提到性能的概念,在Android 开发中性能是多个维度的指标,但有一个明确的表象:操作卡顿。(想必所有 Android 用户都经历过吧)

为什么存在性能问题

因为 View 本身就是一个 Java 对象,创建 View 需要时间,储存 View 需要空间,按照复制 View 的逻辑,列表的数据如果是无限的,需要的内存就也是无限的,轻则频繁 GC 导致卡顿,重则 OOM 直接崩溃。

如何解决性能问题

列表的问题,解决思路也在列表特性里。因为重复 View 的特点,我们可以将不可见的 View 对象拿出来,填充新的数据,显示在新的位置。

实现一个列表

效果展示: scr0805.gif

实现过程

跟其他 View 相同的是在 xml 中添加一个 RecyclerView,但 xml 无法描述 RecyclerView 的内容。

image.png

然后添加列表的内容。因为要创建可复用的 View,所以我们要写的不是某一个 View,而是一种 View 的创建方法。这个 View 的创建方法通过继承 ViewHolder 实现。

image.png

ViewHolder 中加载的 View 依然可以通过 xml 创建,每个 ViewHolder 只能创建一种 View,复杂的列表可能需要多种样式,这时候应该用多个 ViewHolder 实现而不是在一个 ViewHolder 中做复杂的逻辑变换。

ViewHolder 和 RecyclerView 通过 RecyclerView.Adapter<T: ViewHolder> 连接到一起,Adapter 是一个抽象类,负责对接数据和 View,按要求重写抽象函数即可实现最基本的效果。泛型参数是 ViewHolder 的子类型,所以用到多种 ViewHolder 的时候可能需要先定义成基类,再根据数据做类型强转。

image.png

最后将 Adapter 设置给 RecyclerView 即可,完整代码在 Github


RecyclerView 是一种「深不可测」的 View,基本的使用只是皮毛而已,更多的用法咱们实践中细讲。

即将周末了,周六日计划写实践篇,字数也会多一些,记得来看啊兄弟们,球球各位了。