前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RecyclerView还能这么玩

RecyclerView还能这么玩

作者头像
猴哥yuri
发布2018-08-16 15:39:41
6500
发布2018-08-16 15:39:41
举报
文章被收录于专栏:极客猴极客猴

RecyclerView 从诞生至今,因其具有良好的灵活性、可扩展性而深受人们的爱好。目前已经被开发者广泛应用到App中。本文主要针对 RecyclerView 的可扩展性进行详解,将 RecyclerView 玩出新花样 —— 利用 RecyclerView 实现复杂布局。如果你还对 RecyclerView 不熟悉,建议你先把 RecyclerView 的常规用法学习了再来看本文。

1

需求

我们能用 RecyclerView 实现列表效果,网格列表效果以及瀑布流效果。但是这些都是比较单一布局。如果我们现在有个需求,需要做成这样的效果。 具体如下图 1 和 图2 所示:

图1

图2

我们先分析下这需求。从图 1 和图 2 可知,最外面的控件是支持上下滑动的。这很有可能是一个列表或者是一个 ScrollView 。头部是有 8 个控件以 4 x 2 的方阵排列着。中间部分由 2 x 2 的控件组成一个矩形。底部是类似列表的样式。

2

实现思路

我第一想法就是使用 RecyclerView 进行嵌套。最外面是一个 RecyclerView,它中间再包裹这三个 RecyclerView 。这三个 RecyclerView 分别处理头部、中间部分、底部的排版逻辑。然后再使用通用的 Adapter 进行设配,从而提高代码复用率。这想想还是挺不错。

不过这个方案很快就被我否定了。因为谷歌是不建议 RecyclerView 进行嵌套。硬要这么做,也是没有毛病,所有的 item 会在第一次加载时被初始化,视图复用机制会被作废。还有自己再反问自己几个问题:

  • item 的事件怎么传递以及处理?
  • 如果全部被嵌套的 RecyclerView 都要加载图片,会不会出现卡顿情况?
  • 如果中间选项布局超过 10 个怎么办,难道又要重新添加一个 RecyclerView? 我发现自己都回答不上这几个问题,所以该方案是行不通的。

我记得 ListView 能够利用下面两个方法实现多 Item 布局。

作为 ListView 的替代品的 RecyclerView, 应该是支持这种实现吧。果然,不出我所料。

我发现 RecyclerView 也有 getItemViewType 方法,但 getViewTypeCount 已经没有了。值得注意的是 RecyclerView 必须实现的三个方法中 onCreateViewHolder(ViewGroup parent, int viewType) 第二个参数正是布局的类型。

那么这就好办了, 我们可以通过根据不同的 item 来返回不同的布局类型。 这个方案既简单同时不会破坏 RecyclerView 的机制,又能保证良好的可扩展性。所以我最终采用最这种方法来实现上面的效果。

3

代码实现

1)根据不同的 viewType 加载不同的布局。头部 8 个控件可以用统一布局文件来表示,中间 4 个控件也同样的原理,剩下底部也是采用一个 xml 文件来表示。

2)数据的来源。 Adapter 的数据都是由 Activity 传递过来的。我们把 RecycleView 分割为三个部分,这就需要在 MainActivity 中给 Adapter 传递三个不同泛型的 List。

3)数据绑定 因为有三个不同的 ViewHolder, 所以需要对三个不同的 ViewHolder 绑定不同 List。

4)显示样式 在 MianActivity 中,我采用的是 4 列的网格布局管理局。有人一定会问为什么一定要选择 4 列?就不能 5 列?6 列? 很简单,因为在整个列表中,在头部中一行有 4 个控件, 1 个控件占据 1 个span。我就以头部的数据为标准,这样比较方便计算出后面 item 中每个控件占据每行的 span 数。

在 MultitudeAdapter 中,需要计算好每个控件占据多少个 span 。重载父类的方法 onAttachedToRecyclerView ,并动态为不同 position 设置不同的 SpanSize

小贴士

因微信不支持站内链接, 请点击【阅读原文】阅读完整的代码

作者:猴哥,公众号:极客猴。爱好读书,喜欢钻研技术,梦想成为文艺青年的IT Boy。

- END -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 极客猴 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档