Android:水平居中Gridview

问题描述

| 我需要在我的android layout.xml中将网格视图水平居中。我已经在Google搜索了很长一段时间,但是没有找到答案。 我只能通过更改strechMode来更改gridview的水平位置,但随后我的各项就不会彼此靠近了。 我需要的是物品彼此靠近(无空间)并水平居中。我选择strechmode = none,所以现在我的项目彼此靠近,但是它们在屏幕的左侧,我只希望它们水平居中。 这是我的布局xml:
<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"
          android:layout_width=\"fill_parent\" 
          android:layout_height=\"fill_parent\"
          android:background=\"@drawable/background\" 
          android:gravity=\"center\">

<GridView android:id=\"@+id/lw_gridview\" 
          android:layout_width=\"wrap_content\"
          android:layout_height=\"wrap_content\"
          android:numColumns=\"3\" 
          android:columnWidth=\"48dp\"
          android:horizontalSpacing=\"0dp\"
          android:verticalSpacing=\"0dp\"
          android:stretchMode=\"none\"
          />


</LinearLayout>
这是图像适配器在gridview上设置的图像片段:
imageView = new ImageView(context);
imageView.setLayoutParams(new GridView.LayoutParams(48,48)); //on medium density
imageView.setScaleType(ImageView.ScaleType.CENTER);
imageView.setPadding(0,0);
我怎样才能成功?     

解决方法

我通过计算和设置其填充手动将网格视图居中。这是我的2英镑的工作: 找出屏幕的宽度和密度 将项目宽度和间距的常量值从DIP转换为像素 计算我可以容纳的列数。 等式如下所示,
numColumns
是唯一的未知数:
numColumns * itemWidth + (numColumns - 1) * spacingBetweenItems + selectorPadding <= sreenWidth
numColumns
,计算我的网格视图实际需要多少水平空间 具有实际的网格视图宽度,请设置填充以使其最终位于屏幕中心 好的,这是一些代码:
// Convert DIPs to pixels
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
mSizePx = (int) Math.floor(SIZE_DIP * metrics.scaledDensity);
mSpacingPx = (int) Math.floor(SPACING_DIP * metrics.scaledDensity);

GridView gridview = (GridView) findViewById(R.id.gridview);
// Find out the extra space gridview uses for selector on its sides.
Rect p = new Rect();
gridview.getSelector().getPadding(p);
int selectorPadding = p.left + p.right;

// Determine the number of columns we can fit,given screen width,// thumbnail width,and spacing between thumbnails.
int numColumns = (int) Math.floor(1f * (metrics.widthPixels - selectorPadding + mSpacingPx)
        / (mSizePx + mSpacingPx));

int contentWidth = numColumns * mSizePx; // Width of items
contentWidth += (numColumns - 1) * mSpacingPx; // Plus spaces between items
contentWidth += selectorPadding; // Plus extra space for selector on sides

// Now calculate amount of left and right margin so the grid gets
// centered. This is what we
// unfortunately cannot do with layout_width=\"wrap_content\"
// and layout_gravity=\"center_horizontal\"
int slack = metrics.widthPixels - contentWidth;

gridview.setNumColumns(numColumns);
gridview.setPadding(slack / 2,slack / 2,slack / 2);
    ,在GridView布局或样式上将拉伸模式设置为columnWidth: android:stretchMode = \“ columnWidth \” 列宽将拉伸以填充可用空间。您可以将网格项包装在透明的容器中,该容器将均匀拉伸,同时保留可见内容的宽度。 android:columnWidth属性将用作\“最小列宽。\”也可用于android:numColumns = auto_fit,android:horizo​​ntalSpacing和android:verticalSpacing。 根据您的网格项目是什么,您可能不想在内容周围添加透明容器。如果您不这样做,内容宽度将平均伸展,实际上在更多设备上看起来更好。     ,您是否检查了GridView在LinearLayout中的位置是否正确? 尝试将ѭ7用于GridView。 另外,尝试
android:gravity=
和不同的位置,以更清晰地了解重力对布局的工作方式。     ,可能我真的来晚了,但是如果您遇到这个问题(就像我一样),这就是我为解决问题所做的事情:
<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"
    android:layout_width=\"match_parent\"
    android:layout_height=\"match_parent\">

    <TextView
        android:id=\"@+id/emotions_header\"
        android:layout_width=\"match_parent\"
        android:layout_height=\"wrap_content\"
        android:layout_alignParentTop=\"true\"/>

    <GridView
        android:layout_width=\"match_parent\"
        android:layout_height=\"wrap_content\"
        android:layout_centerVertical=\"true\"/>

    <TextView
        android:layout_width=\"wrap_content\"
        android:layout_height=\"wrap_content\"
        android:layout_alignParentBottom=\"true\"
        android:layout_alignParentRight=\"true\"
        android:layout_alignParentEnd=\"true\"/>
</RelativeLayout>
我的GridView位于垂直居中,另外两个TextView位于顶部和右按钮。 更多信息:RelativeLayout,定位视图