【问题标题】:How to get the number of rows of a GridView?如何获取 GridView 的行数?
【发布时间】:2026-01-29 18:10:01
【问题描述】:

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

【问题讨论】:

    标签: android gridview


    【解决方案1】:

    我昨晚必须解决这个问题,它对我有用。它查找孩子的宽度并假设所有单元格具有相同的宽度,将 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() 添加的任何单元格间距。如果您使用水平间距,则可能需要对此进行调整以解决此问题。
    • 就我而言,我没有任何填充或额外的宽度需要考虑。如果这样做,则需要对此进行调整,以确保除法最终得到正确答案。

    【讨论】:

      【解决方案2】:

      我解决了 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);
      

      【讨论】:

        【解决方案3】:

        试试这个:

        Math.ceil( (double)gridView.getCount() / (double)gridView.getNumColumns() );
        

        【讨论】:

        • 可能需要 getNumColumns 而不是 getColumnWidth。
        • 感谢您的帮助。不幸的是,getNumColumns() 适用于 API 级别 11 或更高级别。
        【解决方案4】:

        在这里添加重复的答案,因为我最初回答了 duplicate question

        我在我的一个自定义 GridView 子类上添加了这个实现,它按预期工作。我检查了 GridView 类的声明字段,至少在 API 8 上,它们确实已经有一个名为 mNumColumns 的字段(这是 getNumColumns() 在 API 18 上返回的内容)。他们可能没有将字段名称更改为其他名称,然后又在 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 的回答),但我发现它非常整洁。

        【讨论】:

          【解决方案5】:

          如果您查看Android API 指南 中的GridView 页面,您会看到有一个名为onItemClickListener 的方法,其中一个参数是位置。加上getNumColumns(),也许你可以得到行数。

          【讨论】:

          • 谢谢。 getNumColumns() 不适用于 API 级别 8