码迷,mamicode.com
首页 > 其他好文 > 详细

ScrollView镶嵌listview显示不全的原因

时间:2018-02-11 14:53:40      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:高度   gpo   listview   原因   integer   http   显示不全   img   解决方法   

   当ScrollView镶嵌listview会显示不全,通过查看ScrollView测量高度的源码,会发现ScrollView重写了父类viewGroup的measureChildWithMargins方法:

  技术分享图片

  测量child的高度,传递的是UNSPECIFIED(尽可能大的)
  再来看看listview自身onMeasure的测量高度方法:

  技术分享图片

  final int heightMode = MeasureSpec.getMode(heightMeasureSpec),heightMeasureSpec是父容器传过来的;

  当测量方式为UNSPECIFIED时,高度=top+bottom+一个childHeight+两个边框长度。

  就会出现listview显示不全。

  解决方法:
  自定义一个listview,重写listview的onMeasure方法:

  技术分享图片

  看看makeMeasureSpec方法

  技术分享图片

  将测量方式改为AT_MOST,那为什么我们又要给个最大值呢,跟着方法走:

  技术分享图片

  会发现listview在测量child时有个这个方法,设最大值是为了跳过这个方法,我们只需要测量child高度累加就行了。

  那为啥又要位移两位呢?下面代表个人看法:  

  listview获取高度是这样算的:

   int heightSize = MeasureSpec.getSize(heightMeasureSpec);

  heightMeasureSpec是

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

  super.onMeasure(widthMeasureSpec, expandSpec);

  传过来的。makeMeasureSpec方法 return (size & ~MODE_MASK) | (mode & MODE_MASK)拼接的,我们再看看AT_MOST:
    public static final int AT_MOST     = 2 << MODE_SHIFT;

   所有个人认为右移两位使heightSize刚好为Integer.MAX_VALUE。

    

  

 

         

 

ScrollView镶嵌listview显示不全的原因

标签:高度   gpo   listview   原因   integer   http   显示不全   img   解决方法   

原文地址:https://www.cnblogs.com/zyandroid/p/8440885.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!