Android:GridView宽度没有包装到内容?

时间:2011-04-13 14:19:52

标签: android

我正在尝试在对话框中显示GridView。尽管我付出了很多努力,GridView的宽度也会增长到整个屏幕,而不是包裹到列中。下面是布局和描述问题的图像(我为GridView设置了背景颜色来说明问题)。

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/colorgridview"
    android:background="#FF00CCBB"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    android:numColumns="4"
    android:verticalSpacing="5dp"
    android:horizontalSpacing="5dp"
    android:columnWidth="70dp"
    android:stretchMode="none"
/>

enter image description here

4 个答案:

答案 0 :(得分:1)

我知道这篇文章有点过时了。但如果有人需要解决方案,这个答案可能会派上用场。

可以在屏幕测量后设置视图的宽度。

要做到这一点:

让您的类实现OnGlobalLayoutListener。 调用onGlobalLayout方法时会测量屏幕。我们可以在这里做我们的魔力。 GridView.getLayoutParams()。width = ....

编辑: 我不太清楚如何添加onGlobalLayoutListener。看看plugmind的帖子,他展示了如何添加它。 Can't figure out how to get view/layout width/height

亲切的问候, BRAM

答案 1 :(得分:0)

我认为您应该使用android:layout_width="fill_parent"而不是android:layout_width="wrap_content",因为换行内容会使用它所需的最小位置。另一方面,fill_parent使用所需的所有空间。你应该摆脱"android:columnWidth="70dp".

答案 2 :(得分:0)

当然可以设置固定的layout_width(以dp为单位)。由于您的列数也已修复,这可能是一种解决方法吗?

答案 3 :(得分:0)

有同样的问题...... 我用覆盖的onMeasure()

解决了这个问题
public class GridViewEx extends GridView {

    private int mRequestedNumColumns = 0;

    public GridViewEx(Context context) {
        super(context);
    }

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

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

    @Override
    public void setNumColumns(int numColumns) {
        super.setNumColumns(numColumns);

        if (numColumns != mRequestedNumColumns) {
            mRequestedNumColumns = numColumns;
        }
    }

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

        if (mRequestedNumColumns > 0) {
            int width = (mRequestedNumColumns * getColumnWidth())
                    + ((mRequestedNumColumns-1) * getHorizontalSpacing())
                    + getListPaddingLeft() + getListPaddingRight();

            setMeasuredDimension(width, getMeasuredHeight());    
        }
    }
}