相信每个android开发者都用到过ListView和Scrollview,当我们在使用Scrollview嵌套ListView的时候会出现ListView无法全部显示的问题,那么是什么引起的呢我们一起打开源码看下。
首先我们看下ScrollView是继承自FrameLayout,FrameLayout的onMeasure方法有如下代码
代码比较简单就是循环查找自己的子View如果子View不是GONE的话就调用ViewGroup的measureChildWithMargins方法
然后我们在看下ScrollView是重写了measureChildWithMargins方法
ScrollView重新measureChildWithMargins方法并且对他的childHeightMeasureSpec进行设置值,设置他的高度的测量模式heightMode为MeasureSpec.UNSPECIFIED设置完成以后调用了child.measure(childWidthMeasureSpec, childHeightMeasureSpec);方法,紧接着也就是进入了ListView的onMeasure方法
以上是LIstView里面的关于测试模式为MeasureSpec.UNSPECIFIED的代码,我们不难从代码中看出来,第一个判断意思是如果他的Item的总数大于0并且它的高或者宽有一个模式为MeasureSpec.UNSPECIFIED就会执行这个方法,那么正常情况下系统这个判断就是为true,也就是拿到它的一个item的高度childHeight = child.getMeasuredHeight();紧接着它判断它的高度的模式是否为MeasureSpec.UNSPECIFIED显然也是true所以他就是让它的整个的高度等于childHeight 最后完成setMeasuredDimension(widthSize, heightSize);也就是造成了我们的ListView无法正常显示,那么我们现在已经知道问题出现的原因了那么怎么解决问题也就变得非常简单了,我们需要更改他的模式为MeasureSpec.AT_MOST让它执行
这个测量模式的高度就可以了,所以我们只需要继承ListView然后重新他的onMeasure方法就可以了如下
网友评论