0

我在这上面花了几个小时,查看了我在没有解决方案的情况下可以找到的每一个相关的 SO 问题。

这是我的问题:

我有图像的网格视图。我需要 3 列(以匹配 iOS 版本和美学)。如果我将 numColumns 设置为 3,我会在每一行的图像行的顶部和底部之间获得很多额外的空间。如果我将宽度设置为自动调整,我总是得到 2,它们看起来更好,但更喜欢 3 列。

我错过了什么?

布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="top" >

<LinearLayout 
    android:id="@+id/llayout"       
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    >
    <ImageView
        android:id="@+id/header"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#666666"
        android:clickable="false"
        android:contentDescription="@string/title_card_collection"
        android:src="@drawable/sportscard2x" />
</LinearLayout>

<GridView
    android:id="@+id/cardGrid"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_above="@+id/llayout"
    android:gravity="center"
    android:horizontalSpacing="2dip"
    android:numColumns="3"
    android:stretchMode="columnWidth"
    android:layout_alignParentBottom="true"
    android:verticalSpacing="2dip" >
</GridView>

截屏

我希望这是一件容易的事,我只是想念。提前致谢。

更新:添加截图。问题是只显示了 1 行,如果向下滚动,您会看到其他 3 行,但两者之间有很大的空间。

4

1 回答 1

3

<编辑>

请在下面找到“提示 3”。可以在此处找到带有代码的示例。

</编辑>

我认为问题在于您将您的layout_height设置<GridView>wrap_content. 网格视图似乎无法正确计算它的总包裹高度,因此,它只显示一行。

您可以将其设置layout_heightmatch_parent(或任何其他固定高度 - 比如120dp或其他),或者您可以尝试扩展GridViewJava 对象并进行一些自己的计算(然后您需要在 XML 布局中使用自定义网格视图对象作为好吧:)<com.package.to.MyCustomGridView>

不过,我确实需要强调,在 API 11 之前,没有任何明确定义的方法可以从 Java 代码中的网格视图中获取列数(您需要这样做以计算数据的行数适配器会产生)。是在 API 11 中引入的getNumColumns。也没有找到行间距的正确方法(getHorizontalSpacing()andgetVerticalSpacing()方法是在 API 16 中引入的)。

供您参考:http: //developer.android.com/reference/android/widget/GridView.html

提示1: 我自己没有测试过,但你可以尝试这样的事情:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ...
        />

    <GridView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1.0"
        ...
        />

</LinearLayout>

即在线性布局中包含您的网格视图,并在布局图像视图后为其添加所有可用空间。

提示 2: 您可以编写自己的列表视图。索尼移动教程网站上似乎有一些不错的糖果(不,我没有受雇于索尼移动:-),不过;好教程就是好教程):http: //developer.sonymobile.com/2010/05/20/android-tutorial-making-your-own-3d-list-part-1/

提示 3: 您可以扩展 JavaGridView对象并覆盖onMeasure以下示例中的方法。GridView请记住在 Android 布局 XML 文件中引用您的扩展类(如<com.package.MyGridView android:layout_width="match_parent" android:layout_height="wrap_content" ... />

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int heightSpec;

    // The great Android "hackatlon" (in order to enable "wrap_content" on grid views).
    if (getLayoutParams().height == LayoutParams.WRAP_CONTENT) {
        heightSpec = MeasureSpec.makeMeasureSpec(
                Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
    }
    else {
        heightSpec = heightMeasureSpec;
    }

    super.onMeasure(widthMeasureSpec, heightSpec);
}

希望你能从中找到一些灵感:-)

干杯,--dbm

于 2012-10-01T12:05:38.783 回答