Android - 使 GridView 更小以垂直适应而无需滚动

Android - make GridView smaller to fit vertically without scrolling

我有一个 Gridview,大约在屏幕的一半。它充满了 ImageViews 是二次的。问题是 GridView 填满了整个宽度,因此使其垂直滚动。

我想将 GridView 的宽度减小到垂直适合而无需滚动。我既不希望图像变形也不希望更改列大小。

我已经尝试了不同的 android:stretchMode,但除了 columnWidth,它根本没有显示 gridView。

简单地添加填充或边距不是我想要的,因为它应该适合所有屏幕尺寸。

这是我的布局文件:

<?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" >

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <GridView
            android:id="@+id/gridViewPlayer2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"        
            android:numColumns="3"
            android:gravity="center"
            android:layout_gravity="center"
            android:stretchMode="columnWidth"
            android:horizontalSpacing="3dp"
            android:verticalSpacing="3dp" >

        </GridView>

    </LinearLayout>



    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <Chronometer
            android:id="@+id/timer_p2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:textSize="20sp"
            android:text="Chronometer"
            android:gravity="right"
            android:rotation="180" />

         <Chronometer
            android:id="@+id/timer_p1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:textSize="20sp"
            android:gravity="right" />

     </LinearLayout>



    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <GridView
            android:id="@+id/gridViewPlayer1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"        
            android:numColumns="3"
            android:gravity="center"
            android:layout_gravity="center"
            android:stretchMode="columnWidth"
            android:horizontalSpacing="3dp"
            android:verticalSpacing="3dp" >

        </GridView>

    </LinearLayout>

</LinearLayout>

提前致谢。

我不明白你到底在找什么。但是您可以动态设置网格视图的宽度和网格视图的列宽。

好的,我找到了一个很好的解决方法,它完全符合我的要求。这很简单:

因为我的 GridView 是二次方的,所以我设法得到了 LinearLayout 的高度,并用该值设置了 GridView 的宽度。 (我没有直接在 GridView 上设置宽度,而是在我添加的另一个 LinearLayout 上设置宽度以解决一些导入问题)。

这是我的 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" >

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="center">

        <LinearLayout 
            android:id="@+id/layout_help_p2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center_horizontal"
            android:orientation="vertical">

            <GridView
                android:id="@+id/gridViewPlayer2"
                android:layout_width="match_parent"
                android:layout_height="match_parent"        
                android:numColumns="3"
                android:gravity="center"
                android:layout_gravity="center"
                android:stretchMode="columnWidth"
                android:horizontalSpacing="3dp"
                android:verticalSpacing="3dp"
                android:rotation="180" >

            </GridView>

        </LinearLayout>
    </LinearLayout>



    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <Chronometer
            android:id="@+id/timer_p2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:textSize="20sp"
            android:text="Chronometer"
            android:gravity="right"
            android:rotation="180" />

         <Chronometer
            android:id="@+id/timer_p1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:textSize="20sp"
            android:gravity="right" />

     </LinearLayout>



    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="center"
        android:id="@+id/layout_grid_p1">

        <LinearLayout 
            android:id="@+id/layout_help_p1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center_horizontal"
            android:orientation="vertical">

            <GridView
                android:id="@+id/gridViewPlayer1"
                android:layout_width="match_parent"
                android:layout_height="match_parent"        
                android:numColumns="3"
                android:gravity="center"
                android:layout_gravity="center"
                android:stretchMode="columnWidth"
                android:horizontalSpacing="3dp"
                android:verticalSpacing="3dp" >

            </GridView>

         </LinearLayout>
    </LinearLayout>

</LinearLayout>

下面是我如何管理所描述的过程:

final LinearLayout mLayoutP1 = (LinearLayout) findViewById(R.id.layout_grid_p1);
final LinearLayout mLayoutHelpP1 = (LinearLayout) findViewById(R.id.layout_help_p1);
final LinearLayout mLayoutHelpP2 = (LinearLayout) findViewById(R.id.layout_help_p2);
  
mLayoutP1.post(new Runnable(){

    @Override
    public void run() {
      layoutHeightP1 = mLayoutP1.getHeight();
   mLayoutHelpP1.setLayoutParams(new LinearLayout.LayoutParams(layoutHeightP1, LinearLayout.LayoutParams.MATCH_PARENT));
   mLayoutHelpP2.setLayoutParams(new LinearLayout.LayoutParams(layoutHeightP1, LinearLayout.LayoutParams.MATCH_PARENT));
 }
   
});

所以结果是:http://abload.de/img/4cu7w.jpg

此解决方法仅适用于我的 GridView 是二次方程。如果有人找到了一种无需滚动即可自动减小 GridView/ListView 垂直适合屏幕宽度的方法,请随时在此处分享!