Android:GridView宽度未包装到内容?

问题描述

| 我正在尝试在对话框中显示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\"
/>
    

解决方法

我知道这篇文章有点过时了。但是,如果有人需要解决方案,那么这个答案可能会派上用场。 屏幕测量后可以设置视图的宽度。 去做这个: 让您的类实现OnGlobalLayoutListener。 当调用onGlobalLayout方法时,将测量屏幕。我们可以在这里做魔术。 GridView.getLayoutParams()。width = .... 编辑: 我对如何添加onGlobalLayoutListener不太清楚。请参阅plugmind的帖子,他显示了如何添加它。 无法弄清楚如何获取视图/布局的宽度/高度 亲切的问候, 布拉姆     ,我认为您应该使用ѭ1而不是
android:layout_width=\"wrap_content\"
,因为包装内容使用了它所需的最小位置。另一方面,fill_parent使用所有需要的空间。更重要的是,您应该摆脱
\"android:columnWidth=\"70dp\".
    ,当然可以设置一个固定的layout_width(在dp中)。由于列数也是固定的,因此这对您来说是一种解决方法?     ,遇到同样的问题... 我用重写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());    
        }
    }
}