如何正确地居中GridView?

我一直在努力尝试,没有这样的运气。 我有幸在这里的所有其他答案以及有关居中GridView也没有运气。 这是我的GridView XML:

 <GridView android:id="@+id/calendar_grid" android:layout_width="match_parent" android:layout_height="match_parent" android:numColumns="7" android:columnWidth="40dp" android:verticalSpacing="1dp" android:horizontalSpacing="1dp" android:paddingTop="2dp" android:stretchMode="columnWidth" android:layout_gravity="right" android:gravity="right" android:background="#696969" ></GridView> 

我尝试了所有我能想到的组合,但没有太多工作。 至less它的设备之间不一致。 这是它总是做的一个形象。

在这里输入图像说明

正如你可以看到在GridView的右侧,有间距。 我试图不断地改变这一点,而且几乎从来没有工作。 使用android:stretchMode确实改变了它,但是它弄乱了我在单元格之间的间距,所以不能工作。 使用重力也失败,你可以看到。 我已经尝试了所有其他值,它仍然没有改变。 它卡在左边。 我也觉得很奇怪,试图改变从40以下的任何东西的任何东西的android:columnWidth的大小。 而当我增加40至45,也没有变化。 但将其改为50就会使右侧的空间消失。 但是,当把它放在我的手机上,间距就在那里! 我像2个星期前跳过这个,继续工作其他的东西,但它看起来像我还没有解决这个问题,甚至不明白为什么我没有尝试的作品。

如果它帮助任何人在这里帮助我,我也可以提供什么使单元格的XML。 但我不确定是否重要。 但这里是:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/day_num" android:layout_width="match_parent" android:layout_height="match_parent" android:textSize="10dp" android:background="#000000" android:height="35dp" android:gravity="center_vertical|center_horizontal" /> </LinearLayout> 

如果有帮助的话,那么GridView的父类是一个LinearLayout其中包含:

 <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_weight="0" android:gravity="center" > 

也有一个重量为1的兄弟姐妹,但我不认为这应该是影响的,因为0的权重使该部分首先设置空间。

编辑

所以我一直在玩它,非常恼火,尤其是因为没有那么多人似乎有这个问题,但它看起来像不pipe我做了多less小的列columnWidth ,GridView几乎没有变小。 事实上,你所看到的同样的差距是它一直持续到50dp。 但是当我进入肖像模式时,差距再次出现,所以我把它提高到了90dp(我试过了,没有任何改变),然后就消失了。 奇怪的是,除了填补空白之外, GridView并没有改变。 所以我可以把它做成200dp,而且在我的屏幕尺寸和其他更小的屏幕上看起来很完美。 一旦我去平板电脑,我怀疑我需要增加更多,但重点是,这是奇怪的行为。 有没有人遇到过这个?

Solutions Collecting From Web of "如何正确地居中GridView?"

你可能想把你的GridView放入一个RelativeLayout ,然后将GridViewlayout_centerInParent属性设置为true 。 像这样的东西:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <GridView android:id="@+id/calendar_grid" android:layout_width="match_parent" android:layout_height="match_parent" android:numColumns="7" android:columnWidth="40dp" android:verticalSpacing="1dp" android:horizontalSpacing="1dp" android:paddingTop="2dp" android:stretchMode="columnWidth" android:background="#696969" android:layout_centerInParent="true" /> </RelativeLayout> 

RelativeLayout可以更好地控制孩子的位置。

这是我的工作configuration:

  <GridView android:id="@+id/gridView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:cacheColorHint="@color/white" android:verticalSpacing="10dp" android:horizontalSpacing="10dp" android:numColumns="3" android:padding="5dp" android:scrollbars="none" android:stretchMode="columnWidth" android:gravity="center" /> 

您需要设置TextView的父布局的重力或TextView的布局重力,Plz更改单元布局,如下所示:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center_vertical|center_horizontal" > <TextView android:id="@+id/day_num" android:layout_width="match_parent" android:layout_height="match_parent" android:textSize="10dp" android:background="#000000" android:height="35dp" /> </LinearLayout> 

我遇到了同样的问题,并与centerInParent RelativeLayout也没有帮助。

基本上,该部门可能会包含一个将根据屏幕宽度被截断的余数。

所以,对GridView进行居中的唯一方法是计算一个宽度,该宽度不包含余数,并将余数值用作填充。

 WindowManager manager = window.getWindowManager(); int screenWidth = manager.getDefaultDisplay().getWidth(); int contentWidth = screenWidth; while( 0 != contentWidth%COLUMN_NUMBER ) contentWidth--; columnWidth = contentWidth / COLUMN_NUMBER; int padding = screenWidth - contentWidth; 

那么当你创build你的GridView时:

 gridView.setColumnWidth(columnWidth); gridView.setPadding(padding / 2, 0, padding / 2, 0); 
 There is more specific method to do this. You can define custom layout. And add TextView as the element. Then apply the properties what you want. To center make gravity = center like wise. Then apply that layout as the layout for your grid view. Ex : Sample layout name : myCellitemlayout.xml <TextView> android:id="@+id/text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" </TextView> Now add this to your gridView adapter. Ex: GridView ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.id.myCellitemlayout, numbers); gridView.setAdapter(adapter);