Comment créer Gridview dans Jetpack compose sans utiliser recycler view ou android.widget.gridview?
4 Réponses :
Vous pouvez utiliser la disposition Table
qui organise ses enfants en lignes et en colonnes
Quelque chose comme:
@Composable fun table(){ Padding(2.dp) { Table(columns = 8) { for (i in 0 until 8) { tableRow { for (j in 0 until 8) { Padding(2.dp) { //Cell Text("TX") } } } } } } }
Il convient de noter que cela est fortement gonflé et donc pas bien adapté aux énormes ensembles de données - il n'y a actuellement pas de solution qui gonfle paresseusement (mais il y en aura dans le futur).
Cette réponse n'est plus valide car la Table
n'est plus dans Compose. Même la page n'existe pas
J'ai créé une grille personnalisée pour utiliser Android jetpack compose jusqu'à ce qu'ils ne prennent pas en charge la vue de recyclage officielle pour Gridlayout dans Compose.
@Composable fun Item(t: T) { .... }
UTILISATION
GridView(cols = 4, list = model.list,child = { Item( it) })
Déclaration d'article
@Composable fun <T> GridView( cols: Int = 0, list: List<T>, child: @Composable() (dataModal: T) -> Unit ) { val rows = (list.size / cols) + (if (list.size % cols > 0) 1 else 0) VerticalScroller(modifier = Modifier.fillMaxHeight().fillMaxHeight().drawBackground(color = colorResource( id = R.color.color_bg_application ))) { Table(columns = cols) { for (r in 0 until rows) { tableRow { for (c in 0 until cols) { //Cell val i = (r * cols) + c if (i < list.size) { child(list[i]) } else { break } } } } } } }
J'ai apporté quelques modifications à la réponse de @Madhav (en utilisant compose v1.0.0-alpha01
):
GridView(cols = 2, list = listOf("1", "2", "3", "4",)) { Text(text = it) }
Utilisation :
@Composable fun <T> GridView( cols: Int = 1, list: List<T>, rowModifier: Modifier = Modifier, colModifier: Modifier = Modifier, child: @Composable (dataModal: T) -> Unit ) { val rows = (list.size / cols) + (if (list.size % cols > 0) 1 else 0) ScrollableColumn(modifier = colModifier) { for (r in 0 until rows) { Row(modifier = rowModifier, horizontalArrangement = Arrangement.SpaceAround) { for (cell in 0 until cols) { val i = (r * cols) + cell if (i < list.size) { child(list[i]) } else { break } } } } } }
Encore une autre solution basée sur LazyColumnFor (Jetpack Compose version 1.0.0-alpha04)
@Composable fun <T> LazyGridFor( items: List<T>, rowSize: Int = 1, itemContent: @Composable BoxScope.(T) -> Unit, ) { val rows = items.chunked(rowSize) LazyColumnFor(rows) { row -> Row(Modifier.fillParentMaxWidth()) { for ((index, item) in row.withIndex()) { Box(Modifier.fillMaxWidth(1f / (rowSize - index))) { itemContent(item) } } } } } @Preview("LazyGridFor: example") @Composable() fun LazyGridForPreview() { val data = (1..100).map(Integer::toString) LazyGridFor(data, 3) { item -> Text(item) } }
@Gabriele Matiotti, je voulais dire comment créer une vue en grille sans utiliser android.widget.GridView, et j'ai édité mon message