不管childView是什么模式的measureMode,都会被外层包裹的ScrollView改变成MeasureSpec.UNSPECIFIED
所以会导致我们嵌套的ListView为什么只能展示1个item的源头,参考
从源码角度解析ListView和ScrollView的嵌套冲突
在一般情况下使用 GridView、listView 其实都是高度填充父类窗体(fill_parent、match_parent),那么UI显示正常
不过,当在这个外面嵌套一个垂直方向滚动的布局(ScrollView)之后,特殊情况就出现了。
listview的滑动冲突,gridView的显示一行等
网上已经有理想的解决方案如下:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int heightSpec;
if (getLayoutParams().height == LayoutParams.WRAP_CONTENT) {
// The great Android "hackatlon", the love, the magic.
// The two leftmost bits in the height measure spec have
// a special meaning, hence we can't use them to describe height.
heightSpec = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
}
else {
// Any other height should be respected as is.
heightSpec = heightMeasureSpec;
}
super.onMeasure(widthMeasureSpec, heightSpec);
}
重写listVIew、gridView的onMeasure方法就行了
主要是:
MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
那么其中的两个值就很好理解了
因为32位的数据中的前两位是代表的模式,那么Integer.MAX_VALUE >> 2就代表能获取到的最大值(不含模式下的值)
MeasureSpec.AT_MOST这个模式下面高度会在listView、gridView的item集高度和Integer.MAX_VALUE >> 2 之间取最小值,也就是包裹内容
http://blog.youkuaiyun.com/failure01/article/details/8577013