要带着问题来阅读源码,解惑以满足心中的好奇心,知其然并知其所以然,了解发现 Google 工程师的代码设计原理。
1、猜测是在 onMeasure 的时候,只测量了第一个 item。
在 MeasureSpec.UNSPECIFIED 的时候,只是拿到了 第 1 个 item 的高度。 在 MeasureSpec.AT_MOST 的时候,会把 ListView 的 view 全部加载。
推测在 ScrollView 里面的测量模式 是 MeasureSpec.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 一般是在源码里面调用)