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 zwiększa wydajność aplikacji, utrzymując małą pulę widoków i wykorzystując je ponownie podczas przewijania tych elementów.
W Compose możesz używać list leniwych, aby osiągnąć ten sam efekt. Z tej strony dowiesz się, jak przenieść implementację RecyclerView na listy leniwe w Compose.
Kroki migracji
Aby przenieść implementację RecyclerView do Compose, wykonaj te czynności:
Zakomentuj lub usuń
RecyclerViewz hierarchii interfejsu i dodajComposeView, aby go zastąpić, jeśli nie ma go jeszcze w hierarchii. Będzie to kontener dla listy leniwej, którą 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 kompozycyjnego elementu listy leniwej potrzebujesz, na podstawie menedżera układu
RecyclerView(patrz tabela poniżej). Wybrany element kompozycyjny będzie elementem kompozycyjnym najwyższego poziomuComposeViewdodanego w poprzednim kroku.LayoutManagerComposable
LinearLayoutManagerLazyColumnlubLazyRowGridLayoutManagerLazyVerticalGridlubLazyHorizontalGridStaggeredGridLayoutManagerLazyVerticalStaggeredGridlubLazyHorizontalStaggeredGrid// 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 element kompozycyjny dla każdego typu widoku w implementacji
RecyclerView.Adapter. Każdy typ widoku zwykle odpowiada podklasieViewHolder, ale nie zawsze tak jest. Te elementy 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
onCreateViewHolder()ionBindViewHolder()klasyRecyclerView.Adapterzostanie zastąpiona przez te elementy kompozycyjne i stan, który im przekazujesz. W Compose nie ma rozdzielenia między tworzeniem elementu kompozycyjnego dla elementu a wiązaniem z nim danych – te koncepcje są połączone.W slocie
contentlisty leniwej (końcowy parametr lambda) użyj funkcjiitems()(lub równoważnego przeciążenia), aby iterować po danych na liście. W lambdzieitemContentwywołaj odpowiedni element kompozycyjny dla swoich danych:val data = listOf<MyData>(/* ... */) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { items(data) { ListItem(it) } } }
Częste zastosowania
Dekoracje elementó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ć ItemDecoration, aby dodać separatory między elementami:
val itemDecoration = DividerItemDecoration(recyclerView.context, LinearLayoutManager.VERTICAL) recyclerView.addItemDecoration(itemDecoration)
Compose nie ma odpowiednika koncepcji dekoracji elementów. Zamiast tego możesz dodać dowolne dekoracje interfejsu bezpośrednio w kompozycji. Aby na przykład dodać separatory do listy, możesz użyć elementu kompozycyjnego Divider po każdym elemencie:
LazyColumn(Modifier.fillMaxSize()) { itemsIndexed(data) { index, d -> ListItem(d) if (index != data.size - 1) { HorizontalDivider() } } }
Animacje elementów
W RecyclerView można ustawić ItemAnimator, aby animować wygląd elementów podczas wprowadzania zmian w adapterze. Domyślnie RecyclerView używa
DefaultItemAnimator, który zapewnia podstawowe animacje w przypadku zdarzeń usuwania, dodawania i
przenoszenia.
Listy leniwe mają podobną koncepcję dzięki modyfikatorowi animateItemPlacement.
Więcej informacji znajdziesz w artykule Animacje elementów.
Dodatkowe materiały
Więcej informacji o przenoszeniu 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 RecyclerView:
post na blogu dotyczący efektywnego używania Compose w
RecyclerView.
Polecane dla Ciebie
- Uwaga: tekst linku jest wyświetlany, gdy język JavaScript jest wyłączony.
- Listy i siatki
- Przenoszenie
CoordinatorLayoutdo Compose - Inne kwestie, które warto wziąć pod uwagę