使用GridView的时候,是只能控制列数和列宽,是不能指定每一列的行高的。在加载要显示的内容时,就算在item的布局文件中限定了宽高,但是当item被加载GridView中时,布局文件中的限制是起不到作用的,item会根据加载内容的高度自动调整,如果加载的内容很高或者很矮,那么item也会变的很高或者很矮,导致GridView每一行或者行与行之间的显示高度差异很大,无法控制。可以看一下如下的例子:

item的布局文件:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><ImageView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/imageview"
    android:layout_width="80dp"
    android:layout_height="80dp"
    >
</ImageView></span>



GridView的布局文件

<span style="font-family:KaiTi_GB2312;font-size:18px;">	<GridView 
	    android:id="@+id/gridview"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
		android:numColumns="3"
		android:listSelector="@android:color/transparent"
		android:gravity="center"
	    ></GridView></span>


Adapter中的getView方法:

<span style="font-family:KaiTi_GB2312;font-size:18px;">public View getView(int position, View cv, ViewGroup parent) {
		ViewHolder vh = null;
		if(cv == null){
			cv = inflater.inflate(R.layout.item_layout, null);
			vh = new ViewHolder();
			vh.cv = (ImageView) cv.findViewById(R.id.imageview);
			cv.setTag(vh);
		}else{
			vh = (ViewHolder) cv.getTag();
		}
		Bitmap bitmap = null;
		bitmap =  BitmapFactory.decodeFile(getItem(position));
		vh.cv.setImageBitmap(bitmap);
		//vh.cv.setImageURI(Uri.parse(getItem(position)));
		return cv;
	}</span>


Adapter中的数据源是从MediaStore中获得的图片的存储路径。此时加载图片无论使用setImageBitmap还是setImageURI,显示的效果是一样的。

此时的显示结果截图如下:

gridview android constraintlayout 高度 gridview item高度_布局文件

这三张SD卡上的图片都是尺寸比较大的图片,此时的显示效果原因是这样的:GridView测了一下每张图片的高度和宽度。它希望每一个item都能完整显示要显示的内容,因此GridView会把item设置的跟要显示的内容一样大,但是GridView有列宽的设定,所以GridView只能把图片的宽度缩减到指定的列宽,然后将图片按照原来的宽高比在item中居中进行显示。但是因为没有设置行高(也没有地方指定GridView的行高),因此GridView将item的高度保留为要显示图片的原始高度!如果我们给item的布局文件加上scaleType属性为fitXY,就可以看到每一个item不同的高度:

gridview android constraintlayout 高度 gridview item高度_布局文件_02

所以,虽然我们给item设置了明确的80dp*80dp,但是作为父控件的GridView根本不管这一套,GridView会根据自己的原则来设定item的大小,这个原则跟要显示的图像大小有关。所以,为了真正达到希望的每一行item都能按照80dp*80dp来显示(不考虑GridView的strechMode对列宽的拉伸),我们有两种方式:1)改变一下GridView设置item大小的方式,或者2)改变一下item中加载图像的大小。

1)改变GridView设置item大小的方式:

<span style="font-family:KaiTi_GB2312;font-size:18px;">        int size = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 80, context.getResources().getDisplayMetrics());
        if(cv == null){
            cv = inflater.inflate(R.layout.item_layout, null);
            vh = new ViewHolder();
            vh.cv = (ImageView) cv.findViewById(R.id.imageview);
            AbsListView.LayoutParams params = new AbsListView.LayoutParams(size, size);
            vh.cv.setLayoutParams(params);
            cv.setTag(vh);
        }else{
            vh = (ViewHolder) cv.getTag();
        }</span><span style="font-family:KaiTi_GB2312;font-size:18px;">
                        
</span>


2)也可以改变以下item中要加载的图像的大小

<span style="font-family:KaiTi_GB2312;font-size:18px;">        Bitmap bitmap = null;
	bitmap =  BitmapFactory.decodeFile(getItem(position));
	bitmap = Bitmap.createScaledBitmap(bitmap, size, size,false);//这里的size值和1)中的size值获取方式一样,都是80dp
	vh.cv.setImageBitmap(bitmap);
</span>


上面两种方法选择一种就可以,此时显示的效果会如下所示:

gridview android constraintlayout 高度 gridview item高度_android_03