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

11

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

Ваш Ответ

5   ответов
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);
3

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

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

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

Благодарю. getNumColumns () недоступна для API уровня 8 Hong
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.
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), но я нашел, что это довольно аккуратно, как это.

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

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