阅读本文之前,你需要的一些知识储备:
-
对View的绘制流程有一些简单的了解。
-
Canvas的简单实用。
-
RecyclerView+GridLayoutManager的使用。
目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r0aANdR2-1571057729479)(https://upload-images.jianshu.io/upload_images/15679108-8e15e077e709ab1d?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
一、场景
使用RecyclerView+GridLayoutManager+ItemDecoration定制首页适用的场景:
-
有多个功能模块
-
子视图多个样式
-
最后一个模块需要刷新(如果有这样的功能,肯定也是通过RecyclerView实现的),例如QQ音乐中往下滑推荐用户可能感兴趣的音乐。
个人觉得该方案的意义在于减少布局的嵌套,让界面管理变得更加简单,但是对于业务特别复杂的情况下可能会不适用。
二、思路
实现以上功能需要解决两个难点:
-
如何给不同行展示不同数量的子视图
-
每个模块标题的绘制
这两个问题的解决方案分别对应着GridLayoutManager和ItemDecoration,我们挨个了解。
1. GridLayoutManager
GridLayoutManager其实我们已经很熟悉了,只是我们平时没有了解SpanSize这个概念,先看如下一段代码:
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
GridLayoutManager gll = new GridLayoutManager(this, 6);
mRecyclerView.setLayoutManager(gll);
上面的代码中我们创建了一个纵向、每行最多容量6个子View的GridLayoutManager,默认情况下,一行总的SpanSize为6,每个子视图默认的SpanSize为1,所以不做处理的情况下GridLayoutManager会将每一行分成6份,每一份展示一个子视图,如下图的第一行:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MoM2W1h6-1571057729481)(https://upload-images.jianshu.io/upload_images/15679108-bdff703c1ff803ff?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
这时,我如果将子视图的SpanSize都设置为2,那么这个子视图将占整个RecyclerView可用宽度的2/6,如上图第