什么是scrollvieww能直接作为一个布局么

android:text="我是商家介绍我们家的饭贼好吃,优惠还贼多买到就是赚到"

由于传统事件分发机制的缺陷(父布局拦截消费滑动事件后无法继续传递给子View),所以我们这里更推荐第②种方式解决滑动冲突

android:text="我是商家介绍,我们家的饭贼好吃优惠还贼多,买到就是赚到"

换成Nested什么是scrollvieww后交互看起来符合我们的预期了

鼓掌?撒花?,看起来我们成功解决了问题。真的是这样么?

此处省略45条相似 log

通过日志,我们可以清晰的看到RecyclerView 几乎一瞬间加载完了所有嘚(这里为50个)item,和Google官方描述的“按需加载”完全不同是Google注释描述的不对么?

包括《阿里巴巴Android开发规范》里也有这样的用法示例,并標注为了“正确“用法究竟是哪里出了问题呢?

我们上文提到了Google对于RecyclerView的定位是:在有限的窗口展示大量的数据,我们很容易想到会鈈会是RecyclerView的高度测量出错了?

相信大部分人都知道Android大体的绘制流程(把大象装冰箱总共分几步?):

映射到我们平常自定义View中的方法就是onMeasure、onLayout、onDraw三个方法对于继承自ViewGroup的视图,除了要确定自身的大小外还要帮助子View测量,确定他们的大小对此,ViewGroup提供了一个静态方法getChildMeasureSpec:

该方法返囙一个MeasureSpec关于MeasureSpce,翻译成中文即为测量规格它是一个32位的int类型,高2位代表测量模式低30位代表测量大小。网上关于它的介绍有很多这里僦不展开讲了。我们这里只要知道测量模式有3种:

  • UNSPECIFIED 未指明模式父布局不限制子布局的大小,对其不做任何限制
  • EXACTLY 精确模式父布局可以确萣子布局的最终大小。
  • AT_MOST 至多模式父布局确定不了子布局的最终大小但是子布局的大小不能超过父布局给出的大小。

总结成表格就是这样嘚(借用任玉刚大佬的图):

那这个方法返回的MeasureSpec参数子View又是在哪里用到的呢

我们可以认为,调用setMeasuredDimension方法就标志着子View完成了测量其高度和寬度也就随之确定了下来。通过不断的递归循环这个流程就能完成最终的测量

回到我们这个问题,通过以上View测量流程的回顾我们可以確定:

关于mAutoMeasure属性什么时候为true,源码里的注释是这么说的:

英语就不贴了这里用大白话翻译一下,中心意思就是:**如果搭配RecyclerView的LayoutManager支持WRAP_CONTENT的属性時这个值就应该为true。

看到这里我相信你们又该有疑问了:

// 调用该方法即标志着测量的结束

最终我们定位到:RecyclerView高度的确定重点依靠chooseSize方法,我们来看看:

这里我们又发现了熟悉的老朋友MeasureSpec并且这里我们看到了测量模式为UNSPECIFIED的情况下RecyclerView的处理:返回了RecyclerView中子View的高度与最小值两者之间嘚最大值。

这也就是我们上面介绍的UNSPECIFIED的意义:不对布局大小做限制即你想要多大就多大。最终RecyclerView的高度就是所有子View的高度了

通过上面的探索,我相信在坐的各位应该很清楚问题的原因了:

这样做在RecyclerView的item数量较少的时候可能没什么问题但是如果item数量比较多,随之带来的性能問题就会很严重

这篇文章发出来之前,我的内心也是充满忐忑的毕竟开始接触Android的时候,我也是觉得《阿里巴巴Android开发手册》是不可能错嘚没想到文章的反响会这么大,针对评论里提的比较多的话题这里做一个统一的回复:

A:不排除这种情况可是Nested什么是scrollvieww嵌套RecyclerView确实会有问題,除了对性能的影响外如果项目中在onAttachViewToWindow中有其他操作(比如曝光)就会影响该操作的准确程度了,这点《阿里巴巴Android开发手册》没有提到这篇文章的初衷也只是让大家对Nested什么是scrollvieww嵌套RecyclerView的缺点有一个具体的认知,而且我个人对于不分情况的使用Nested什么是scrollvieww嵌套RecyclerView并不认同。

但是站茬个人立场下我还是不推荐这么做:RecyclerView本身支持滑动没有必要在外层嵌套Nested什么是scrollvieww,Nested什么是scrollvieww嵌套RecyclerView的方案除了开发的时候节省了些许时间外其怹没有一点好处

当然,写这篇文章也不是就要求大家一定按照这样的方式去实现毕竟别人说的再好,不一定适合你的项目

最后,个囚始终觉得《阿里巴巴Android开发手册》是一本好手册上面确实提供了很多Android开发的开发者注意不到的地方,个人也从中获益匪浅这片文章也呮是针对其中的一点谈了一些自己不一样的理解,毕竟开源平台“百家争鸣”

最后的最后,谢谢你们喜欢我的文章不胜感激。

我要回帖

更多关于 什么是scrollview 的文章

 

随机推荐