0
点赞
收藏
分享

微信扫一扫

ListView与ScrollView冲突

少_游 2022-09-14 阅读 67


不管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 之间取最小值,也就是包裹内容

举报

相关推荐

0 条评论