【问题标题】:Center GridView horizontally [duplicate]水平居中 GridView [重复]
【发布时间】:2013-12-19 11:19:59
【问题描述】:

我有一个 GridView,其中包含 4 个动态添加的项目。我可以将它们垂直居中,但不能水平居中。什么都试过了……

Main.xml

...
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:layout_gravity="center" >

        <GridView
        android:id="@+id/grid"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:columnWidth="90dp"
        android:numColumns="auto_fit"
        android:padding="10dp"
        android:verticalSpacing="10dp"
        android:horizontalSpacing="10dp"
        android:stretchMode="spacingWidthUniform"
        android:gravity="center"
        android:listSelector="@drawable/card_button" >

        </GridView>

    </LinearLayout>
... 

Items.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/btn"
    android:layout_width="match_parent"
    android:layout_height="90dp"
    android:orientation="vertical"
    android:gravity="center" >

            <ImageButton
                android:id="@+id/menuItem_img"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/light"
                android:contentDescription="@string/item"
                android:background="#00000000"
                android:tint="#222222"
                android:paddingTop="8dp"
                android:paddingBottom="4dp" />

            <TextView
                android:id="@+id/menuItem_txt"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#222222"
                android:paddingBottom="8dp"
                android:text="@string/item"
                android:textSize="18sp"
                android:singleLine="true" />

</LinearLayout>

我不想有固定数量的列,所以 android:numColumns="auto_fit" 必须保留。

【问题讨论】:

    标签: android gridview alignment


    【解决方案1】:

    我发现无法使用 .xml 将 GridView 水平居中
    所以我必须以编程方式进行......这个答案对我帮助很大:https://stackoverflow.com/questions/6141910/android-center-gridview-horizontally

    我必须进行一些更改才能使其正常工作:

    GridView Adapter.java:

      public Adapter(Context context, int width, int height, float density, GridView grid) {
            this.context = context;
            width_ = width; //get metrics.widthPixels from MainActivtiy.java
            height_ = height; //get metrics.heightPixels from MainActivtiy.java
            density_ = density; //get metrics.scaledDensity from MainActivtiy.java
            grid_ = grid; //get GridView
    
            Rect p = new Rect();
            grid_.getSelector().getPadding(p);
            int selectorPadding = p.left + p.right;
            int mSizePx = (int) Math.floor(90 * density_); //90 is my column width
            int mSpacingPx = (int) Math.floor(10 * density_); //10 is space between columns
            int numColumns = (int) Math.floor(1f * (width_ - selectorPadding + mSpacingPx) / (mSizePx + mSpacingPx));
    
            // CHANGES
            int numbOfCol = menuValues.length; //menuValues (Array[]) are items you are adding to GridView
            int contentWidth = 0;
            //the most important part
            if (numColumns > numbOfCol) {
                contentWidth = numbOfCol * mSizePx;
                contentWidth += (numbOfCol - 1) * mSpacingPx;
                contentWidth += selectorPadding;
            } else {
                contentWidth = numColumns * mSizePx;
                contentWidth += (numColumns - 1) * mSpacingPx;
                contentWidth += selectorPadding;
            }           
            int slack = width_ - contentWidth;
            //
            grid_.setNumColumns(numColumns); //set calculated number of collumns
            grid_.setColumnWidth(mSizePx); //90
            grid_.setVerticalSpacing(mSpacingPx); //10
            grid_.setHorizontalSpacing(mSpacingPx); //10
    
            //changed
            grid_.setPadding(slack / 2, mSpacingPx, slack / 2, mSpacingPx); //I set top and bottom padding to 10dp (mSpacingPx)
    
        }
    

    Main.xml(已更改):

    ...
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:layout_gravity="center" >
    
            <GridView
            android:id="@+id/grid"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:stretchMode="none"
            android:gravity="center"
            android:listSelector="@drawable/card_button"
            android:drawSelectorOnTop="true" >
    
            </GridView>
    
        </LinearLayout>
    ... 
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2012-12-16
    • 2013-10-14
    • 2016-01-06
    • 2019-09-02
    • 2012-04-16
    相关资源
    最近更新 更多