在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全部展开显示了。