关于groupview嵌套listview的理解与分析

groupview嵌套listview会导致listview只显示一行的问题,解决方法就是重写listview的onmeasure方法,具体如下:

  1. import android.content.Context;
  2. import android.util.AttributeSet;
  3. import android.widget.ListView;

  4. public class ListViewForScrollView extends ListView {
  5.     public ListViewForScrollView(Context context) {
  6.         super(context);
  7.     }

  8.     public ListViewForScrollView(Context context, AttributeSet attrs) {
  9.         super(context, attrs);
  10.     }

  11.     public ListViewForScrollView(Context context, AttributeSet attrs,
  12.         int defStyle) {
  13.         super(context, attrs, defStyle);
  14.     }
  15.         
  16.     @Override
  17.    
  18.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  19.         int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
  20.         MeasureSpec.AT_MOST);
  21.         super.onMeasure(widthMeasureSpec, expandSpec);
  22.     }
  23. }
下面来分析一下:

首先,看看makeMeasureSpec方法:static int makeMeasureSpec(int size,int mode):根据提供的大小值和模式创建一个测量值(格式)

 public static int makeMeasureSpec(int size, int mode) {
            return size + mode;
         }
简单说一下,这个方法的主要作用就是根据你提供的大小和模式,返回你想要的大小值,这个里面根据传入模式的不同来做相应的处理。

所以我们重写onMeasute方法中的expandSpec的值就是一个非常大的int值

其次,再将这个值赋给super.onMeasure,那么我们重写的这个listview的值就是非常大的int值,必须填满屏幕!!

如果我将MeasureSpec.AT_MOST改成MeasureSpec.EXACTLY,那么这个listview就会变成expandSpec这么长,因为atmost表示子元素至多到达指定的大小,也就是listview的所有item加起来的长度,而exatcly则是Integer.MAX_VALUE >> 2这么长!!如果用MeasureSpec.UNSPECIFIED,我猜默认就是这种,那么长度就是一个item的长度,而这就是grideview嵌套listview的问题所在。

 一个MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽度和高度的要求。一个MeasureSpec由大小和模式组成。它有三种模式:UNSPECIFIED(未指定),父元素部队自元素施加任何束缚,子元素可以得到任意想要的大小;EXACTLY(完全),父元素决定自元素的确切大小,子元素将被限定在给定的边界里而忽略它本身大小;AT_MOST(至多),子元素至多达到指定大小的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值