Android:水平居中gridview

时间:2011-05-26 16:27:51

标签: android gridview android-layout

我需要在我的android layout.xml中水平居中网格视图。我已经搜索了谷歌很长一段时间,但没有成功找到答案。

我只能通过更改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, 0, 0);

我怎么能成功?

4 个答案:

答案 0 :(得分:16)

我通过计算和设置其填充来手动居中我的网格视图。这是我的onCreate所做的:

  • 找出屏幕宽度和屏幕密度
  • 将项目宽度和间距的常量值从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, slack / 2);

答案 1 :(得分:11)

在GridView布局或样式上将拉伸模式设置为columnWidth:

机器人:stretchMode = “columnWidth时”

列宽将拉伸以填充可用空间。您可以将网格项目包装在透明容器中,该容器将保持均匀拉伸,同时保留可见内容的宽度。 android:columnWidth属性将作为“最小列宽”。这也适用于android:numColumns = auto_fit,android:horizo​​ntalSpacing和android:verticalSpacing。

根据您的网格项目,您可能不希望在内容周围添加透明容器。如果不这样做,内容宽度将均匀拉伸,实际上在更多设备上看起来会更好。

答案 2 :(得分:1)

可能我真的很晚了,但是如果你谈到这个问题(正如我所做的那样),这就是我为解决问题所做的工作:

<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, Positioning Views

答案 3 :(得分:0)

您是否检查过GridView在LinearLayout中的位置是否正确? 尝试使用android:layout_gravity="center"进行GridView。 此外,尝试使用android:gravity=和不同的位置,以更清晰地了解重力如何适用于布局。