ScrollView嵌套GridView,GridView只显示单行

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29078329/article/details/78143003

    在ScrollView里嵌套GridView时,GridView是以单行显示出来的,这是由于GridView和ScrollView里都有滑动属性,ScrollView无法判断GridView里的item高度是多少,于是只显示单个Item的高度,剩下内容就被隐藏了,要解决的这个问题需要重新测量GridView的高度。

package com.xi.liuliu.topnews.view;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.GridView;

/**
 * Created by zhangxb171 on 2017/9/8.
 */

public class ImgPickerGridView extends GridView {
    public ImgPickerGridView(Context context) {
        super(context);
    }

    public ImgPickerGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ImgPickerGridView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    /**
     * 重新测量GridView的高度,返回重新测量GridView的高度的实际高度
     *
     * @param widthMeasureSpec
     * @param heightMeasureSpec
     */
    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int expandSpec = MeasureSpec.makeMeasureSpec(
                Integer.MAX_VALUE, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}


在布局文件中引用ImgPickerGridView:

 <ScrollView
        android:id="@+id/scroll_view_broke_news_activity"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <com.xi.liuliu.topnews.view.ImgPickerGridView
                android:id="@+id/grid_view_broke_news_activity"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="15dp"
                android:columnWidth="106dp"
                android:horizontalSpacing="5dp"
                android:numColumns="3"
                android:verticalSpacing="5dp">

            </com.xi.liuliu.topnews.view.ImgPickerGridView>
              
        </LinearLayout>


    </ScrollView>

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和控件宽/高之间的最小值。正常使用时不会超过极限值,返回的就是控件的宽/高,ScrollView收到GridView的大小,GridView的内容就可以全部展开了。

猜你喜欢

转载自blog.csdn.net/qq_29078329/article/details/78143003