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