Предполагая, что вы знаете соотношения между высотами отдельных рядов, вы можете попытаться использовать SpanSizeLookup
для регулировки высоты каждого ряда. В вашем простом случае меньший элемент (50dp) займет одну строку (размер диапазона 1), а более крупный элемент (100dp) займет две строки (размер диапазона 2), поэтому вся сетка в целом будет содержать 3 строки.
Конечно, для более сложной конфигурации строк отношения могут быть немного более сложными: скажем, я хотел строки высот 32dp / 48dp / 64dp, тогда отношения высот 32/144, 48/144 и 64/144 , который мы можем упростить до 2/9, 3/9, 4/9, получив всего 9 рядов, с размерами промежутков 2, 3 и 4 для отдельных элементов. В крайних случаях это может привести к большому количеству строк (когда дроби не могут быть упрощены), но, если вы используете какой-либо тип сетки (x8, x10 и т. Д.) И элементы имеют разумный размер, он все равно должен быть управляемым .
В любом случае, в вашем случае код будет таким:
val layoutManager = GridLayoutManager(this, 3, RecyclerView.HORIZONTAL, false)
layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int) = when (position % 2) {
0 -> 1 // 50dp item
else -> 2 // 100dp item
}
}
Учитывая больше строк, оператор when
будет становиться все более сложным, но если у вас уже есть адаптер, вы можете использовать getItemViewType
, чтобы легче различать отдельные строки в операторе when
.
Если количество типов элементов велико или часто меняется (например, разные типы элементов на разных экранах), вы, конечно, также можете реализовать приведенную выше логику в коде, предполагая, что у вас есть доступ к высотам отдельных типов элементов. Просто сложите высоты, чтобы получить знаменатель, а затем найдите наибольший общий делитель всех высот и сумму, чтобы найти «коэффициент упрощения».