Вопрос по gridview, android – Как получить количество строк в GridView?

11

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

Ваш Ответ

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();
}

Однако есть некоторые важные ограничения, на которые следует обратить внимание.

  • It will only work after the GridView is laid out and only when it actually has some views added to it.
  • This doesn't take into account any cell spacing added with setHorizontalSpacing(). If you use horizontal spacing you may need to tweak this to account for it.
  • In my case I didn't have any paddings or additional width to account for. If you do, you will need to tweak this to ensure the division ends up with the right answer.
1

Если вы посмотрите наВид сетки страница из AndroidAPI Guide, вы увидите, что есть метод с именемonItemClickListenerгде одним из параметров является позиция. Вместе сgetNumColumns() может быть, вы можете получить количество строк.

Благодарю. getNumColumns () недоступна для API уровня 8 Hong
3

попробуй это:

Math.ceil( (double)gridView.getCount() / (double)gridView.getNumColumns() );
Вероятно, вы хотите получить getNumColumns вместо getColumnWidth.
упс .. исправлено сейчас, спасибо
Спасибо за попытку помочь. К сожалению, getNumColumns () предназначена для API уровня 11 или выше. Hong
4

Я решил проблему отсутствия 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);
2

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

Я добавил эту реализацию в мой собственный подкласс GridView, и он работал как положено. Я проверил объявленные поля класса GridView и по крайней мере в API 8 у них уже есть поле с именемmNumColumns (это то, что возвращается в API 18getNumColumns()). Вероятно, они не изменили имя поля на что-то другое, а затем вернулись между 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), но я нашел, что это довольно аккуратно, как это.

Спасибо, это работает для меня.

Похожие вопросы