Contenu du post
🚀Отказываюсь от Списков в пользу Сеток в UI Раньше для списков в Compose я по привычке использовал LazyColumn. Но чем больше работаю с адаптивными интерфейсами, тем очевиднее: это никуда не годиться и надо использовать доступное пространство, а не тупо растягивать интерфейс. Перехожу на Grid компоновку ✔️ LazyVerticalGrid позволяет задать фиксированную ширину колонки, и система сама рассчитает, сколько их поместится на экране. В результате: 1️⃣ адаптивность «из коробки» на телефонах, планшетах и больших экранах 2️⃣ минимум дополнительного кода, 3️⃣единый компонент вместо костылей для разных форм-факторов. LazyVerticalGrid( columns = GridCells.Adaptive(minSize = 120.dp), modifier = Modifier.fillMaxSize(), contentPadding = PaddingValues(8.dp) ) { items(100) { Item(...) } } Определение количества колонок происходит на основе политики GridCell: // всегда N колонок GridCells.Fixed(N) // автоматический расчет на основе минимальной ширины колонки GridCells.Adaptive(minSize = 120.dp) // каждая ячейка шириной 100dp GridCells.FixedSize(100.dp) 📱 На маленьком экране это будет 2–3 колонки, а на планшете — уже 5–6, и всё это без ручной логики. Есть еще более гибкий вариант если элементы строк должны быть разной высоты - LazyVerticalStaggeredGrid (стиль как в Pinterest) LazyVerticalStaggeredGrid( columns = Adaptive(minSize = 150.dp), modifier = Modifier.fillMaxSize(), contentPadding = PaddingValues(8.dp) ) { items(100) { Item(...) } } ❗️ Теперь я придерживаюсь строго правила: Если не могу явно сформулировать почему интерфейс должен быть в одну колонку, то вертикальный список брать не стоит! 🔗 Очень хорошо построение списков осветили в документации по Lazy Layout Аналогично можно проделать и с RecyclerView, использую вместо LinearLayoutManager вариант с сеткой - GridLayoutManager или StaggeredGridLayoutManager, только там не будет автоматического расчета колонок на основе доступного места. Это придется реализовывать самостоятельно. ✍️ Что думаете о таком подходе для UI?Ударит по производительности? #ui#android#compose