Есть ли способ получить количество строк для GridView для Android API уровня 8?
Как получить количество строк 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()
. Если вы используете горизонтальное расстояние, вам может потребоваться настроить его для его учета. - В моем случае у меня не было никаких 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()
возможно, вы можете получить количество строк.