RecyclerView è un componente View che semplifica la visualizzazione efficiente di grandi set di dati. Anziché creare visualizzazioni per ogni elemento del set di dati, RecyclerView migliora le prestazioni della tua app mantenendo un piccolo pool di visualizzazioni e riciclandole mentre scorri gli elementi.
In Compose, puoi utilizzare gli elenchi lazy per ottenere lo stesso risultato. Questa pagina descrive come eseguire la migrazione dell'implementazione di RecyclerView per utilizzare gli elenchi lazy in Compose.
Passi per la migrazione
Per eseguire la migrazione dell'implementazione di RecyclerView a Compose, segui questi passaggi:
Commenta o rimuovi
RecyclerViewdalla gerarchia della UI e aggiungi unComposeViewper sostituirlo se non è ancora presente nella gerarchia. Questo è il container per l'elenco lazy che aggiungerai:<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- <androidx.recyclerview.widget.RecyclerView--> <!-- android:id="@+id/recycler_view"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="match_parent />"--> <androidx.compose.ui.platform.ComposeView android:id="@+id/compose_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>Determina il tipo di composable di elenco lazy di cui hai bisogno in base al gestore del layout di
RecyclerView(vedi la tabella di seguito). Il composable selezionato sarà il composable di primo livello diComposeViewche hai aggiunto nel passaggio precedente.LayoutManagerComponibile
LinearLayoutManagerLazyColumnoLazyRowGridLayoutManagerLazyVerticalGridoLazyHorizontalGridStaggeredGridLayoutManagerLazyVerticalStaggeredGridoLazyHorizontalStaggeredGrid// recyclerView.layoutManager = LinearLayoutManager(context) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { // We use a LazyColumn since the layout manager of the RecyclerView is a vertical LinearLayoutManager } }
Crea un composable corrispondente per ogni tipo di visualizzazione nell'implementazione di
RecyclerView.Adapter. In genere, ogni tipo di visualizzazione viene mappato a una sottoclasseViewHolder, anche se non è sempre così. Questi componibili verranno utilizzati come rappresentazione della UI per diversi tipi di elementi nell'elenco:@Composable fun ListItem(data: MyData, modifier: Modifier = Modifier) { Row(modifier.fillMaxWidth()) { Text(text = data.name) // … other composables required for displaying `data` } }
La logica nei metodi
onCreateViewHolder()eonBindViewHolder()diRecyclerView.Adapterverrà sostituita da questi componibili e dallo stato che fornisci. In Compose, non esiste una separazione tra la creazione di un componibile per un elemento e l'associazione dei dati al suo interno: questi concetti sono uniti.All'interno dello slot
contentdell'elenco Lazy (il parametro lambda finale), utilizza la funzioneitems()(o un overload equivalente) per eseguire l'iterazione dei dati dell'elenco. Nella funzione lambdaitemContent, richiama l'elemento componibile appropriato per i tuoi dati:val data = listOf<MyData>(/* ... */) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { items(data) { ListItem(it) } } }
Casi d'uso comuni
Decorazioni degli elementi
RecyclerView ha il concetto di ItemDecoration, che puoi utilizzare per aggiungere un disegno speciale per gli elementi nell'elenco. Ad esempio, puoi aggiungere un
ItemDecoration per aggiungere divisori tra gli elementi:
val itemDecoration = DividerItemDecoration(recyclerView.context, LinearLayoutManager.VERTICAL) recyclerView.addItemDecoration(itemDecoration)
Compose non ha un concetto equivalente di decorazioni degli elementi. Puoi invece aggiungere qualsiasi decorazione dell'interfaccia utente nell'elenco direttamente nella composizione. Ad esempio,
per aggiungere divisori all'elenco, puoi utilizzare l'elemento componibile Divider dopo ogni
elemento:
LazyColumn(Modifier.fillMaxSize()) { itemsIndexed(data) { index, d -> ListItem(d) if (index != data.size - 1) { HorizontalDivider() } } }
Animazioni degli elementi
È possibile impostare un ItemAnimator su un RecyclerView per animare l'aspetto degli elementi man mano che vengono apportate modifiche all'adattatore. Per impostazione predefinita, RecyclerView utilizza DefaultItemAnimator, che fornisce animazioni di base per gli eventi di rimozione, aggiunta e spostamento.
Gli elenchi lazy hanno un concetto simile tramite il modificatore animateItemPlacement.
Per saperne di più, consulta Animazioni degli elementi.
Risorse aggiuntive
Per saperne di più sulla migrazione di un RecyclerView a Compose, consulta le seguenti risorse:
- Elenchi e griglie: documentazione su come implementare elenchi e griglie in Compose.
- Jetpack Compose Interop: Using Compose in a RecyclerView:
blog post sull'utilizzo efficiente di Compose all'interno di un
RecyclerView.
Consigliati per te
- Nota: il testo del link viene visualizzato quando JavaScript è disattivato
- Elenchi e griglie
- Esegui la migrazione di
CoordinatorLayouta Compose - Altre considerazioni