7

GridView 的行为不像它应该的那样。此屏幕截图显示 GridView(横向模式)向左刷新。我希望它居中。

这是 GridView 的 XML 布局。

<LinearLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/templatelandscape"
  android:orientation="horizontal"
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content">
<GridView 
  android:id="@+id/commandsbarlandscape"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_weight="1.0"
  android:layout_alignParentTop="true"
  android:layout_centerInParent="true"
  android:padding="0dp"
  android:verticalSpacing="2dp"
  android:horizontalSpacing="2dp"
  android:numColumns="auto_fit"
  android:columnWidth="52dp"
  android:stretchMode="spacingWidth"
  android:gravity="fill_horizontal" />
</LinearLayout>

我究竟做错了什么 ?

4

7 回答 7

3

我不知道你是否解决了你的问题(我希望是的,而且我在这篇文章上的回答也很晚!),但这里有一个线索:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center" >

    <GridView
        android:id="@+id/gridview2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:columnWidth="90dp"
        android:numColumns="auto_fit"
        android:stretchMode="spacingWidth" >

    </GridView>
</LinearLayout>

不幸的是,仅当网格上有 1 个内容时才有效。也许有人可以改进它!

于 2013-01-26T15:47:47.653 回答
1
  1. android:layout_height="wrap_content"对于具有自己滚动功能的小部件(例如GridView.

  2. android:layout_alignParentTop="true"并且android:layout_centerInParent="true"是为了RelativeLayout,不是LinearLayout

摆脱你的android:layout_weight="1.0",改变你android:layout_height"fill_parent"或一个特定的高度,改变你LinearLayoutRelativeLayout,你可能会处于更好的状态。

于 2009-10-09T15:37:53.540 回答
1

使用以下属性设置 LinearLayout 的值

android:gravity="center".

并从 gridview 中删除以下行

android:layout_centerInParent="true"
于 2012-02-22T05:23:42.887 回答
0

而不是在LinearLayout中设置GridView,而是在RelativeLayout中设置,在GridView中设置layout_centerHorizo​​ntal=truelayout_centerVertical=true

于 2013-02-18T12:52:15.513 回答
0

尝试切换到 RelativeLayout 并从网格视图中删除水平填充。水平填充导致我的网格偏离中心。我在网格项目布局周围添加了一个视图容器来创建填充。

于 2012-01-06T23:50:29.187 回答
0

你的 GridLayout 应该是这样的..

<LinearLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/templatelandscape"
  android:orientation="horizontal"
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content"
  android:layout_gravity="center_horizontal">
<GridView 
  android:id="@+id/commandsbarlandscape"
  android:background="@android:color/darker_gray"
  android:layout_gravity="center_horizontal"
  android:layout_width="0dp"
  android:layout_height="wrap_content"
  android:layout_weight="1.0"
  android:verticalSpacing="2dp"
  android:horizontalSpacing="2dp"
  android:numColumns="auto_fit"
  android:columnWidth="52dp"
  android:stretchMode="none"
  android:gravity="fill_horizontal" />

我只是将 android:layout_gravity="center_horizo​​ntal" 放在父布局中,因此它将 gridlayout 设置在它的父中心,而不是它的中心内容。还添加了 android:layout_width="0dp" 因为它等于 ""warp_content" 属性,如果你给 "0dp" 它会显示更好的结果。我还删除了你添加的相对布局属性,你可以观察到,如果你不使用 RelativeLayout 然后使用那些什么都不做的属性是没有意义的。

出于测试目的,您可以检查它是否正常工作,或者不只是使用以下 xml 代码进行测试

<LinearLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/templatelandscape"
  android:orientation="horizontal"
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content"
  android:layout_gravity="center_horizontal">
<GridView 
  android:id="@+id/commandsbarlandscape"
  android:background="@android:color/darker_gray"
  android:layout_width="300dp"
  android:layout_height="wrap_content"
  android:layout_weight="1.0"
  android:verticalSpacing="2dp"
  android:horizontalSpacing="2dp"
  android:numColumns="auto_fit"
  android:columnWidth="52dp"
  android:stretchMode="none"
  android:gravity="fill_horizontal" />
</LinearLayout>

上面的 xml 向您展示了您的网格布局位于父级的中心,但不是它的内容。

希望这个解释对你有用......

于 2012-06-23T09:05:47.293 回答
0

我发现的最佳解决方案是通过代码执行此操作。

这是我的xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dslv="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f1f1f1"
android:orientation="vertical">

<GridView
    android:id="@+id/radio_list_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipToPadding="false"
    android:divider="@null"
    android:drawSelectorOnTop="true"
    android:paddingBottom="@dimen/gridview_column_space"
    android:paddingTop="@dimen/gridview_column_space"
    android:columnWidth="@dimen/gridview_column_width"
    android:numColumns="auto_fit"
    android:verticalSpacing="@dimen/gridview_column_space"
    android:horizontalSpacing="@dimen/gridview_column_space"
    android:stretchMode="none"
    android:scrollbars="none"
    />

<include layout="@layout/placeholder" />

这是在我的片段上发挥作用的代码:

    @Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mGridView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
                Point point = Common.getScreenSize(getActivity());

                int rowSpace = getResources().getDimensionPixelSize(R.dimen.gridview_column_space);
                int rowWidth = getResources().getDimensionPixelSize(R.dimen.gridview_column_width) + rowSpace;

                int minWith = (point.x / rowWidth) * rowWidth;
                int padding = (point.x - minWith) / 2;
                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(minWith + padding * 2, ViewGroup.LayoutParams.MATCH_PARENT);
                params.addRule(RelativeLayout.CENTER_IN_PARENT);


                mGridView.setPadding(padding + rowSpace / 2, 0, padding, 0);
                mGridView.setLayoutParams(params);

                mGridView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
        } 

    }); } 
}
于 2015-11-12T14:22:30.323 回答