groupview嵌套listview会导致listview只显示一行的问题,解决方法就是重写listview的onmeasure方法,具体如下:
- import android.content.Context;
- import android.util.AttributeSet;
- import android.widget.ListView;
-
- public class ListViewForScrollView extends ListView {
-
public ListViewForScrollView(Context context) {
-
super(context);
-
}
-
-
public ListViewForScrollView(Context context, AttributeSet attrs) {
-
super(context, attrs);
-
}
-
-
public ListViewForScrollView(Context context, AttributeSet attrs,
-
int defStyle) {
-
super(context, attrs, defStyle);
-
}
-
-
@Override
-
-
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
-
MeasureSpec.AT_MOST);
-
super.onMeasure(widthMeasureSpec, expandSpec);
-
}
- }
首先,看看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(至多),子元素至多达到指定大小的值。