RecyclerView
to komponent View, który ułatwia efektywne wyświetlanie dużych zbiorów danych. Zamiast tworzyć widoki dla każdego elementu w zbiorze danych,RecyclerView
poprawia wydajność aplikacji, utrzymując małą pulę widoków i wykorzystując je ponownie podczas przewijania tych elementów.
W Compose możesz użyć list leniwych, aby osiągnąć ten sam efekt. Na tej stronie opisujemy, jak przenieść implementację RecyclerView
, aby używać list leniwych w Compose.
Etapy migracji
Aby przenieść implementację RecyclerView
do Compose, wykonaj te czynności:
Zakomentuj lub usuń element
RecyclerView
z hierarchii interfejsu i dodaj elementComposeView
, jeśli nie ma go jeszcze w hierarchii. Oto kontener listy leniwej, który dodasz:<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>
Określ, jakiego typu funkcji kompozycyjnej Lazy list potrzebujesz, na podstawie menedżera układu
RecyclerView
(patrz tabela poniżej). Wybrany komponent będzie komponentem najwyższego poziomu wComposeView
dodanym w poprzednim kroku.LayoutManager
Kompozycyjne
LinearLayoutManager
LazyColumn
lubLazyRow
GridLayoutManager
LazyVerticalGrid
lubLazyHorizontalGrid
StaggeredGridLayoutManager
LazyVerticalStaggeredGrid
lubLazyHorizontalStaggeredGrid
// recyclerView.layoutManager = LinearLayoutManager(context) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { // We use a LazyColumn since the layout manager of the RecyclerView is a vertical LinearLayoutManager } }
Utwórz odpowiedni komponent kompozycyjny dla każdego typu widoku w swoim wdrożeniu
RecyclerView.Adapter
. Każdy typ widoku jest zwykle mapowany na podklasęViewHolder
, ale nie zawsze tak jest. Te komponenty kompozycyjne będą używane jako reprezentacja interfejsu różnych typów elementów na liście:@Composable fun ListItem(data: MyData, modifier: Modifier = Modifier) { Row(modifier.fillMaxWidth()) { Text(text = data.name) // … other composables required for displaying `data` } }
Logika w metodach
RecyclerView.Adapter
ionCreateViewHolder()
wonBindViewHolder()
zostanie zastąpiona przez te funkcje kompozycyjne i stan, który im przekazujesz. W Compose nie ma rozróżnienia między tworzeniem komponentu do wyświetlania elementu a powiązaniem z nim danych – te pojęcia są połączone.W
content
gnieździe listy Lazy (ostatni parametr lambda) użyj funkcjiitems()
(lub równoważnego przeciążenia), aby iterować po danych listy. W funkcjiitemContent
wywołaj odpowiedni element kompozycyjny dla swoich danych:val data = listOf<MyData>(/* ... */) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { items(data) { ListItem(it) } } }
Częste przypadki użycia
Dekoracje produktów
RecyclerView
ma koncepcję ItemDecoration
, której możesz użyć, aby dodać specjalny rysunek do elementów na liście. Możesz na przykład dodać znak ItemDecoration
, aby rozdzielić elementy:
val itemDecoration = DividerItemDecoration(recyclerView.context, LinearLayoutManager.VERTICAL) recyclerView.addItemDecoration(itemDecoration)
Compose nie ma odpowiednika dekoracji elementów. Zamiast tego możesz dodać dowolne elementy dekoracyjne interfejsu bezpośrednio w kompozycji. Aby na przykład dodać separatory do listy, możesz użyć funkcji kompozycyjnej Divider
po każdym elemencie:
LazyColumn(Modifier.fillMaxSize()) { itemsIndexed(data) { index, d -> ListItem(d) if (index != data.size - 1) { HorizontalDivider() } } }
Animacje elementów
ItemAnimator
można ustawić na RecyclerView
, aby animować pojawianie się elementów w miarę wprowadzania zmian w adapterze. Domyślnie RecyclerView
używa DefaultItemAnimator
, która zapewnia podstawowe animacje podczas usuwania, dodawania i przenoszenia zdarzeń.
Listy leniwe mają podobną koncepcję dzięki modyfikatorowi animateItemPlacement
.
Więcej informacji znajdziesz w sekcji Animacje elementów.
Dodatkowe materiały
Więcej informacji o migracji RecyclerView
do Compose znajdziesz w tych materiałach:
- Listy i siatki: dokumentacja dotycząca implementowania list i siatek w Compose.
- Współdziałanie Jetpack Compose: używanie Compose w widoku RecyclerView: post na blogu o efektywnym używaniu Compose w
RecyclerView
.
Polecane dla Ciebie
- Uwaga: tekst linku jest wyświetlany, gdy JavaScript jest wyłączony.
- Listy i siatki
- Migracja z
CoordinatorLayout
do Compose - Inne kwestie, które warto wziąć pod uwagę