RecyclerView
to widok, który ułatwia wyświetlanie dużych zbiorów danych. Zamiast tworzyć widoki dla każdego elementu w zbiorze danych, RecyclerView
poprawia skuteczność aplikacji, utrzymując małą pulę widoków i wykorzystując je ponownie podczas przewijania tych elementów.
W sekcji „Tworzenie” możesz użyć listy leniwych, aby osiągnąć ten sam efekt. Na tej stronie opisaliśmy, jak przenieść implementację RecyclerView
na korzystanie z list opóźnionych w Compose.
Etapy migracji
Aby przenieść implementację RecyclerView
do Compose:
Jeśli w hierarchii nie ma jeszcze żadnego elementu
RecyclerView
, odkomentuj lub usuń elementRecyclerView
z hierarchii interfejsu i dodaj elementComposeView
, aby go zastąpić. To jest kontener dla listy Lazy, 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>
Na podstawie menedżera układu
RecyclerView
określ, jakiego typu komponent Lazy List jest Ci potrzebny (patrz tabela poniżej). Wybrany przez Ciebie komponent będzie komponentem najwyższego poziomu w komponencieComposeView
dodanym w poprzednim kroku.LayoutManager
Kompozycja
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 element składany dla każdego typu widoku w implementacji
RecyclerView.Adapter
. Każdy typ widoku zazwyczaj jest mapowany na podklasęViewHolder
, ale nie zawsze tak jest. Te komponenty będą używane jako reprezentacja interfejsu dla 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 metod
onCreateViewHolder()
ionBindViewHolder()
klasyRecyclerView.Adapter
zostanie zastąpiona przez te komponenty i stan, które im przekażesz. W Compose nie ma rozróżnienia między tworzeniem komponentu dla elementu a wiązaniem danych z tym elementem – te pojęcia są połączone.W miejscu
content
na liście Lazy (ostatni parametr lambda) użyj funkcjiitems()
(lub jej równoważnika) do iterowania po danych na liście. W funkcjiitemContent
lambda wywołaj odpowiedni element składany dla swoich danych:val data = listOf<MyData>(/* ... */) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { items(data) { ListItem(it) } } }
Typowe zastosowania
Dekoracje
RecyclerView
ma koncepcję ItemDecoration
, której możesz użyć do dodania specjalnego rysunku do elementów na liście. Możesz na przykład dodać ItemDecoration
, aby wstawić rozdzielacze między elementami:
val itemDecoration = DividerItemDecoration(recyclerView.context, LinearLayoutManager.VERTICAL) recyclerView.addItemDecoration(itemDecoration)
W Compose nie ma odpowiednika dekoracji elementów. Zamiast tego możesz dodawać na liście dowolne elementy interfejtu bezpośrednio w kompozycji. Aby na przykład dodać do listy separatory, możesz użyć kompozytu Divider
po każdym elemencie:
LazyColumn(Modifier.fillMaxSize()) { itemsIndexed(data) { index, d -> ListItem(d) if (index != data.size - 1) { HorizontalDivider() } } }
Animacje elementów
W komponencie RecyclerView
możesz ustawić ItemAnimator
, aby animować wygląd elementów w miarę wprowadzania zmian w adapterze. Domyślnie RecyclerView
używa DefaultItemAnimator
, który zapewnia podstawowe animacje podczas usuwania, dodawania i przenoszenia zdarzeń.
Lista nieaktywna działa na podobnej zasadzie 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 siaktek w Compose.
- Jetpack Compose Interop: Using Compose in a RecyclerView:
Post na blogu o skutecznym korzystaniu z Compose w ramach
RecyclerView
.
Polecane dla Ciebie
- Uwaga: tekst linku jest wyświetlany, gdy obsługa JavaScript jest wyłączona
- Listy i siatki
- Migracja
CoordinatorLayout
do tworzenia wiadomości - Inne kwestie