2015-11-25 3 views
1

У меня есть GridView в моем макете, который должен занимать столько места, сколько доступно (все остальные элементы макета имеют фиксированный размер).Как установить количество столбцов в GridView в соответствии с минимальной и максимальной шириной столбца?

Я хочу, чтобы все ячейки Views в ячейках GridView занимали как можно большую ширину, то есть не оставляли дополнительного пространства, кроме интервала, определенного GridView.

Я хочу, чтобы число столбцов GridView будет автоматически определяться следующими ограничениями:

  • Минимальная ширина столбца должна быть 200dp (если вид сетки сам не меньше)
  • Максимальный столбец ширина должна быть 300dp
  • Я всегда хочу, чтобы максимальное количество столбцов соответствовало этим ограничениям.

Для этого андроида необходимо определить правильное количество столбцов как-то отдельно (auto_fit по умолчанию равно 2, если ширина ячейки неизвестна). Проблема в том, что моя реализация ListAdapter, доставляющая ячейку Views с getView(), должна доставлять виды нужного размера до того, как будет известна ширина сетки (parent.getWidth() вернет 0 изначально).

Таким образом, на этапе компоновки ширина вида сетки еще не известна, но все же вид сетки уже хочет знать количество столбцов. Однако для определения количества столбцов в соответствии с моими ограничениями я должен знать ширину сетки (и поскольку она все равно занимает все свободное пространство, это должно быть возможно знать).

Также можно установить минимальную ширину и высоту на Views, но это, похоже, не помогает с шириной столбцов сетки.

Итак, как можно программно выполнить все эти ограничения?

ответ

0

В конце концов, это было намного легче, чем я думал в начале.

Android делает его более или менее автоматически для вас, если вы:

  • установить android:numColumns="auto_fit" android:stretchMode="columnWidth" в макете вида сетки и
  • установить android:minWidth="200dp" в макете взглядов, используемый для просмотра сетки ячеек и
  • установить android:layout_width="match_parent" android:layout_height="match_parent" в обоих

Это означает, что каждый столбец должен быть по крайней мере, 200 дп и Android будет определять число а f так, чтобы было задано максимальное количество столбцов с шириной столбца не менее 200 dp, и если столбец будет шире, он будет растягивать ячейки (равномерно).

У меня было более сложные решения, связанные с getViewTreeObserver().addOnGlobalLayoutListener(), чтобы подождать, пока вид сетки не определит его размер, чем вычисление количества столбцов, а затем установление Adapter, но вышеприведенное решение было идентичным по результату и значительно меньшим усилиям.

Смежные вопросы