ScrollView 嵌套 ListView 只显示第一行的源码分析

要带着问题来阅读源码,解惑并且以满足心中对源码都做了些什么的好奇心,知其然并知其所以然,然后可以了解发现 Google 工程师的代码设计原理,汲取精华,提升编码的基本内涵。

1、首先猜测为题是出在了 onMeasure 的时候,它只是测量了第一个 item。打开 ListView 的 onMeasure()。

 

在 MeasureSpec.UNSPECIFIED 的时候,obtainView(0, mIsScrap)只是拿到了 第 1 个 item 的高度,这个是只显示 ListView 的第一行的原因所在。 

在 MeasureSpec.AT_MOST 的时候,measureHeightOfChildren() 会遍历 ListView 的 view 全部加载。

 

可以推测在 ScrollView 里面的测量模式 是 MeasureSpec.UNSPECIFIED。

 

 

ScrollView 重写了 measureChildWithMargins(),并且指定了 UNSPECIFIED 的测量模式。

 

2、解决方法: 

自定义 ListView ,重写 onMeasure 方法,

int heightSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthSpec, heightSpec);

在这里把我们的 ListView 重新赋值成 AT_MOST。

(1、这里的 size 右移两位,是因为 size 低30位, 高两位是 mode。

2、MeasureSpec.UNSPECIFIED 一般是在源码里面调用)

——目前最优解决方案。

猜你喜欢

转载自www.cnblogs.com/stormprogrammer/p/9706336.html
今日推荐