控制GridView中的行高

来源:互联网 发布:java开发物流管理系统 编辑:程序博客网 时间:2024/05/17 07:39

使用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值获取方式一样,都是80dpvh.cv.setImageBitmap(bitmap);</span>
上面两种方法选择一种就可以,此时显示的效果会如下所示:


0 0