2017-04-14 78 views
11

我正在Android Studio上制作游戏,并且存在Grid View组件的问题。我无法将网格视图内的项目居中对齐,如After图像。我尝试了几种方法,如android:stretchModeandroid:layout_centerHorizontal,但它没有帮助。这里是我的XML代码:Gridview中的居中对齐项目

<RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:background="@android:color/holo_orange_light" 
     android:layout_weight="8" 
     android:layout_gravity="center"> 

     <GridView 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_margin="10px" 
      android:id="@+id/gridAnswersChar" 
      android:numColumns="8" 
      android:gravity="center"> 
     </GridView> 

</RelativeLayout> 

前:

enter image description here

后:

enter image description here

+0

你有没有找到解决方案? – FiXiT

+0

我还不知道:( –

+0

很想看到这个答案。面对同样的问题。 – lostintranslation

回答

10

希望这不是一个严格的要求,为你,你使用GridView,如我相信你所寻找的东西本质上是不可能的。但是,如果您愿意使用RecyclerView代替,我为您提供了一个解决方案。

该解决方案将利用FlexboxLayoutManager,谷歌的FlexboxLayout项目的一部分:https://github.com/google/flexbox-layout

我的解决方案的完整代码在这里看到: https://gist.github.com/zizibaloob/0c44bfe59b371b5ae0bd2edcb4a7e592

我会在这里覆盖的重要位。首先,FlexboxLayoutManagerMainActivity.onCreate()设置:

FlexboxLayoutManager manager = new FlexboxLayoutManager(this, FlexDirection.ROW); 
manager.setJustifyContent(JustifyContent.CENTER); 

RecyclerView recycler = (RecyclerView) findViewById(R.id.recycler); 
recycler.setLayoutManager(manager); 

当我们创建布局管理器,我们通过FlexDirection.ROW告诉它我们希望它出水平放置我们的项目(即填补了行,然后流到下一个行,而不是填满一列,然后流向下一列)。

然后,我们使用JustifyContent.CENTER致电setJustifyContent()告诉经理我们希望部分填充的行以居中。

第二个重要的位是我们模仿GridView行为的方式以及它具有一定数量的列的能力。此代码是MyAdapter.onCreateViewHolder():这里

ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) itemView.getLayoutParams(); 
layoutParams.width = (parent.getWidth()/4) - layoutParams.leftMargin - layoutParams.rightMargin; 
itemView.setLayoutParams(layoutParams); 

的关键是(parent.getWidth()/4),这给每个项目视图可用宽度的四分之一。如果你想有一个不同的列数,只是改变48

我们也从宽度减去leftMarginrightMargin因为我们的项目视图具有裕度,我们需要留出空间为它们。如果你的观点不会有利润率,你可以跳过这个。

把它放在一起,你会得到一个应用程序看起来像这样:

enter image description here enter image description here

+0

真棒。谢谢! – lostintranslation

0

容易和更好的方式来排列图片和内容的中心是利用重力在你item_layout文件中心,不在您的网格视图的父级。

+0

当然,这会将项目中的内容居中,但不会将网格视图中最后或奇数项目居中。 @BenP答案显示了仅靠重力无法实现的解决方案。 – lostintranslation

+0

还要添加textview宽度以匹配parent和textAlignment属性以居中。 – ShockWave