解决ScrollView 嵌套 ListView高度显示一行的问题

问题:正常情况下ScrollView 嵌套 ListView ,会导致listView只显示一行的问题,如下图

解析:首先我们要了解几个基本知识

 在View的方法onMeasure()中

// 获取宽高的模式

int widthMode = MeasureSpec.getMode(widthMeasureSpec); // 获取前两位

int heightMode = MeasureSpec.getMode(heightMeasureSpec);

// 获取宽高的值

int widthSize = MeasureSpec.getSize(widthMeasureSpec); // 获取后面30位

int heightSize = MeasureSpec.getSize(heightMeasureSpec);

MeasureSpec.AT_MOST : 在布局中指定了wrap_content 

MeasureSpec.EXACTLY : 在不居中指定了确切的值  100dp  match_parent  fill_parent

MeasureSpec.UNSPECIFIED : 尽可能的大,很少能用到,ListView , ScrollView 在测量子布局的时候会用UNSPECIFIED

widthMeasureSpecwidthMeasureSpec : 会包含两个信息是一个32位的值,第一个信息是模式:2位  值:30位 

源码研读:

综上分析:问题应该是出在对测量高度的模式中出现了问题

在ScrollView中的子布局测量源码如下:


强制把子布局的模式设置成:MeasuerSpec.UNSPECIFIED;

所以解决方案 就是把在父布局强制设置的模式改掉:如下图:


后面的模式参数大家都懂 ,那么为什么前面是size 要写成  Int.MAX_VALUE shr2????

答:在ListView的测量高度measureHeightOfChildren的方法中,源码如下:


如果 maxHeight 小的话,那么可能高度值没测完就小于当前的returnedHeight了 这样会导致返回的值不是实际测量的高度。。

你可能感兴趣的:(解决ScrollView 嵌套 ListView高度显示一行的问题)