Как получить количество строк GridView?

Есть ли способ получить количество строк для GridView для Android API уровня 8?

Ответ 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(). Если вы используете горизонтальное расстояние, вам может потребоваться настроить его для его учета.
  • В моем случае у меня не было никаких paddings или дополнительной ширины для учетной записи. Если вы это сделаете, вам нужно будет настроить его, чтобы гарантировать, что деление закончится правильным ответом.

Ответ 2

Я решил отсутствие getNumColumns в V8, в случае, когда количество столбцов указано в ресурсе, объявив целочисленный ресурс и используя его в ресурсе и коде 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() );

Ответ 4

Добавление дублированного ответа здесь, поскольку я сначала ответил на повторяющийся вопрос.

Я добавил эту реализацию в собственный подкласс 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), но я нашел, что это довольно аккуратно.

Ответ 5

Если вы просмотрите страницу GridView из руководства по API Android, вы увидите, что существует метод под названием onItemClickListener, где одним из параметров является позиция. Наряду с getNumColumns() возможно, вы можете получить количество строк.