设置固定的GridView行高

13

我在GridView中遇到了各种问题,主要是行高的问题。

我希望能够在XML中设置项目的大小(高度/宽度),然后让GridView自适应尽可能多的项目,而不会拉伸它们。 如果无法容纳下一个元素,则应该在已经容纳的元素周围添加填充。

目前,我得到了2列(对我来说几乎是固定大小),而行被拉伸了。 请问有人能帮忙解释发生了什么以及如何实现我的需求吗?

GridView:

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/main_grid"
    android:numColumns="auto_fit"
    android:gravity="center"
    android:paddingRight="20dp"
    android:paddingLeft="20dp"
    android:clipToPadding="true"
    android:fitsSystemWindows="true"
    android:stretchMode="none"
    android:background="@drawable/main_grid_background">

</GridView>

网格项(我希望它是320x320的,因为后面我会插入一个背景图片,如果不是完美的正方形,看起来很奇怪)。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="320dp"
    android:layout_height="320dp"
    android:padding="10dp" >

    <TextView
        android:id="@+id/grid_item_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:text="@+id/label"
        android:layout_marginTop="5dp"
        android:textColor="@color/black"
        android:textSize="15sp"
        android:visibility="invisible"
        android:layout_centerInParent="true" >
    </TextView>

</RelativeLayout>

Java:

public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View gridView;

        if (convertView == null) {

            gridView = new View(context);

            // get layout from mobile.xml
            gridView = inflater.inflate(R.layout.main_grid_item, null);

        } else {
            gridView = (View) convertView;
        }
        TextView textView = (TextView) gridView
                .findViewById(R.id.grid_item_label);

            //SET TEXT AND BACKGROUND IMAGE HERE
            //gridView.setBackgroundResource(R.drawable.main_grid_item_import);



        return gridView;
    }

如有可能,请发布拉伸行的屏幕截图。 - Mehul Joisar
@MehulJoisar 请参考图片了解详情。 - AlexIIP
android:stretchMode="spacingWidthUniform" 不是你想要的吗? - Tomasz Gawel
这也适用于我的答案,但只有在我手动设置 android:columnWidth="320dp" 的情况下才有效,我希望不用手动设置。 - AlexIIP
3个回答

50

在CustomAdapter中

v.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, rowHigh));

rowHigh是您必须更改的维度。


1
谢谢。根据应用程序的不同,您可能希望在将v作为final或等效的ViewHolder对象作为final时,在v.post(new Runnable...)内调用此函数。我在一个单元格中有一个“关闭”按钮,它会将自身删除(list.remove(position))并调用notifyDataSetChanged()。仅使用setLayoutParams对我产生了影响(渲染时间出错),将其放入post中可以解决该问题。 - st_bk
1
具体来说,它应该放在getView()或newView()中。请参见文档中的示例:http://developer.android.com/guide/topics/ui/layout/gridview.html#example - John Cummings

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

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

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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int heightSpec;

        if (getLayoutParams().height == LayoutParams.WRAP_CONTENT) {
            // The great Android "hackatlon", the love, the magic.
            // The two leftmost bits in the height measure spec have
            // a special meaning, hence we can't use them to describe height.
            heightSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
        } else {
            heightSpec = heightMeasureSpec;
        }

        super.onMeasure(widthMeasureSpec, heightSpec);
    }


}

在XML中:

<MyGridView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/main_grid"
    android:gravity="center"/>

从 http://www.jayway.com/2012/10/04/how-to-make-the-height-of-a-gridview-wrap-its-content/ 获取 - Hung Tran

4
所以,这不是一个完美的答案,但这就是我让它工作的方法。借鉴了这个线程中的想法。
所有这些都是在我知道我的图像尺寸为320x320的情况下工作的。此外,在GridView中,我必须设置android:columnWidth="320dp",否则它将无法工作。如果有更好的建议,请发表...现在我要继续了。
网格项XML:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="10dp" >
    <ImageView
    android:id="@+id/grid_item_image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"/>
    <TextView
        android:id="@+id/grid_item_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:text="@+id/label"
        android:textColor="@color/black"
        android:layout_alignLeft="@+id/grid_item_image"
        android:layout_alignTop="@+id/grid_item_image"
        android:layout_alignRight="@+id/grid_item_image"
        android:layout_alignBottom="@+id/grid_item_image"
        android:gravity="center"
        android:textSize="15sp"
        android:visibility="invisible">
    </TextView>

</RelativeLayout>

网格视图 XML:

<GridView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/main_grid"
    android:numColumns="auto_fit"
    android:gravity="center"
    android:columnWidth="320dp"
    android:paddingRight="20dp"
    android:paddingLeft="20dp"
    android:clipToPadding="true"
    android:fitsSystemWindows="true"
    android:stretchMode="columnWidth"
    android:background="@drawable/main_grid_background">
</GridView>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接