12

有没有办法获取 Android API Level 8 的 GridView 的行数?

4

5 回答 5

19

我昨晚不得不解决这个问题,它对我有用。它查找孩子的宽度并假设所有单元格具有相同的宽度,将 GridView 的宽度除以孩子的宽度。(getColumnWidth()在早期的 API 中也不可用,因此是解决方法)。

private int getNumColumnsCompat() {
    if (Build.VERSION.SDK_INT >= 11) {
        return getNumColumnsCompat11();

    } else {
        int columns = 0;
        int children = getChildCount();
        if (children > 0) {
            int width = getChildAt(0).getMeasuredWidth();
            if (width > 0) {
                columns = getWidth() / width;
            }
        }
        return columns > 0 ? columns : AUTO_FIT;
    }
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private int getNumColumnsCompat11() {
    return getNumColumns();
}

但是,有一些重要的限制需要注意。

  • 它只会在 GridView 布局之后并且只有当它实际上添加了一些视图时才会起作用。
  • 这不考虑添加的任何单元格间距setHorizontalSpacing()。如果您使用水平间距,您可能需要调整它以解决它。
  • 就我而言,我没有任何填充或额外的宽度需要考虑。如果你这样做了,你需要调整它以确保除法最终得到正确的答案。
于 2013-03-22T13:56:52.867 回答
4

我解决了 V8 中缺少 getNumColumns 的问题,在资源中指定列数的情况下,通过声明一个整数资源并在 GridView 资源和代码中使用它。

<integer name="num_grid_columns">2</integer>

<android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scrollbars="vertical"
    app:columnCount="@integer/num_grid_columns"
    app:orientation="horizontal" >

int cols = getResources().getInteger(R.integer.num_grid_columns);
于 2013-03-07T17:16:28.767 回答
3

试试这个:

Math.ceil( (double)gridView.getCount() / (double)gridView.getNumColumns() );
于 2012-09-01T22:27:19.343 回答
2

因为我最初回答了一个重复的问题,所以在这里添加重复的答案。

我在我的一个自定义 GridView 子类上添加了这个实现,它按预期工作。我检查了 GridView 类的声明字段,至少在 API 8 上,它们确实已经有一个名为的字段mNumColumns(这是 API 18 返回的内容getNumColumns())。他们可能没有将字段名称更改为其他名称,然后又在 API 8 和 18 之间更改,但我没有检查。

@Override
public int getNumColumns() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        return super.getNumColumns();
    } else {
        try {
            Field numColumns = getClass().getSuperclass().getDeclaredField("mNumColumns");
            numColumns.setAccessible(true);
            return numColumns.getInt(this);
        } catch (Exception e) {
            return 1;
        }
    }
}

@Override 不会导致任何错误,因为它只是一个安全检查注释 AFAIK。

我也不知道是否有任何反对建议这样做而不是使用单独的getNumColumnsCompat()方法(如@cottonBallPaws 回答),但我发现它像这样非常整洁。

于 2014-06-14T19:54:58.483 回答
1

如果您查看Android API Guide中的GridView页面,您会看到有一个名为 的方法,其中一个参数是位置。随着也许你可以得到行数。onItemClickListenergetNumColumns()

于 2012-09-01T22:26:36.997 回答