Scrollview嵌套listVIew冲突问题的解决

蔚落 2022-06-06 06:57 417阅读 0赞

大家对listivew和Scrollview都不陌生,每一个组件的使用大家都会信手沾来,不过他们两个联合使用,刚开始给初学者会造成一点伤害,当了解到原因之后,就会恍然大悟

那么ScrollView嵌套listview会遇到什么问题那?

问题一:

在Scrollview添加一个listview会导致两个控件的滚动事件发生了冲突,导致无法滑动。

问题二:

item只能显示一个,显示不全的问题,原因在于

发现在ScrollView中嵌套ListView空间,无法正确的计算ListView的大小

解决办法

现阶段最好的处理方发:自定义listview,重载onmeause()方法,设置全部显示,这个办法在网上搜索,每一个答案都会是这个,

下面我为大家分析这么解决的原因:

源码中分析:

要搞明白原理,就要搞懂MeasureSpec这个类

里面重要的是三种模式:

1.UNSPECIFIED模式:父布局没有给子布局添加约束,子布局想多大就多大

2,EXACTLY模式: 父布局给子布局限定大小,子布局大小是精确的

3,AT_MOST模式:父布局给定了一个最大值,子布局的大小不能超过这个值

通过调用makeMeasureSpec方法

这个方法生成一个带有模式和大小信息,

我们先取Integer.MAX_VALUE来获取int值的最大值,然后左移2位就得到这个临界值最大值了

通过MeasureSpec.AT_MOST

模式来约束他,

通过onMeause()源码上看 ,measure值处理了两种测量模式,

UNSPECIFIED和AT_MOST这两种,UNSPECIFIED的时候只显示一行,

我们一般只用EXACTLY_MOST这两种测量模式,默认使用UNSPECIFIED,

问题在于Scrollview把measureChildWithMargins(child, widthMeasureSpec, 0, heightMeasureSpec, 0);

重写了,结果吧高度测量模式换成了UNSPECLFIED,

问题找到了。只要把listview的测量模式在打回AT_MOST就可以了,

方案:

从写一个ListView,把测量模式打回AT_MOST,然后执行他本身的measure方法。写代码:

代码如下:

@Override

protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec) {

//测量大小由一个32位的数字表示,前两位表示测量模式,后30位表示大小

我们需要拿到测量大小即可

int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2 ,MeasureSpec.AT_MOST);

super .onMeasure(widthMeasureSpec, expandSpec); }

这个问题的原因就解决了,其实只要细心。每一个问题都会迎刃而解的,

发表评论

表情:
评论列表 (有 0 条评论,417人围观)

还没有评论,来说两句吧...

相关阅读