在ScrollView里布局GridView时,GridView显示往往是以单行显示出来。这是由于GridView和ScrollView里都有滑动属性。
ScrollView无法判断GridView里的item高度是多少,于是只显示单个Item的高度,也就是单行显示了,剩下内容被隐藏了。
要解决的这个问题需要重新测量GridView的高度,下面是一个自定义的GridView控件
public class MyGridView extends GridView {
public MyGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyGridView(Context context) {
super(context);
}
public MyGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
**在xml里布局该控件
<com.yourclass.MyGridView
android:id="@+id/gridView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
//......这里不再赘述了,自己自行定义
/>
然后在Java代码里调用
MyGridView gridview = (MyGridView) findViewById(R.id.grid_view);
这里解释一下。
MeasureSpec代表着一组控件的宽高,MeasureSpec.makeMeasureSpec(int size,int mode)方法是根据提供的大小值和模式创建一个测量值(格式)。
在源代码里可以看到这个:
public static int resolveSize(int size, int measureSpec) {
int result = size;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
switch (specMode) {
case MeasureSpec.UNSPECIFIED:
result = size;
break;
case MeasureSpec.AT_MOST:
result = Math.min(size, specSize);
break;
case MeasureSpec.EXACTLY:
result = specSize;
break;
}
return result;
}
MeasureSpec.AT_MOST模式是返回Math.min(size, specSize)给其他函数,也就是返回Integer.MAX_VALUE >> 2和控件的之间的最小值。当我们正常使用不超过极限值时,返回的就是控件的大小。ScrollView收到GridView的大小,就给GridView全部展开显示了。