RecyclerView
to komponent widoku, który ułatwia skuteczne wyświetlanie dużych zbiorów danych. Zamiast tworzyć widoki dla każdego elementu w zbiorze danych, RecyclerView
poprawia wydajność aplikacji, utrzymując niewielką pulę widoków danych i powtórzając je podczas przewijania.
W funkcji tworzenia wiadomości możesz używać leniwych list, aby uzyskać to samo. Na tej stronie opisujemy, jak możesz przenieść implementację RecyclerView
, aby używać leniwch list w usłudze Compose.
Etapy migracji
Aby przenieść implementację RecyclerView
do tworzenia wiadomości, wykonaj te czynności:
Zmień w komentarze lub usuń element
RecyclerView
z hierarchii interfejsu użytkownika i dodaj elementComposeView
, aby go zastąpić, jeśli w hierarchii jeszcze go nie ma. To jest kontener na listę Leniwo, 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 typ funkcji kompozycyjnej Lazy list, której potrzebujesz, na podstawie menedżera układu
RecyclerView
(patrz tabela poniżej). Wybrany przez Ciebie element kompozycyjny będzie nadrzędnym elementem kompozycyjnym elementuComposeView
dodanego w poprzednim kroku.LayoutManager
Funkcja kompozycyjna
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 element kompozycyjny dla każdego typu widoku w implementacji
RecyclerView.Adapter
. Każdy typ widoku jest zwykle mapowany na podklasęViewHolder
, ale nie zawsze tak jest. Te elementy kompozycyjne 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()
w obiekcieRecyclerView.Adapter
zostanie zastąpiona tymi obiektami kompozycyjnymi i stanem, który je podasz. W przypadku tworzenia nie ma rozdzielenia między tworzeniem funkcji kompozycyjnej dla elementu a powiązaniem z nią danych – te koncepcje są ze sobą połączone.W boksie
content
listy Leniwa (końcowego parametru lambda) użyj funkcjiitems()
(lub odpowiadającego mu przeciążenia), aby iterować dane na potrzeby listy. W wyniku lambdaitemContent
wywołaj odpowiedni element kompozycyjny odpowiadający Twoim danym:val data = listOf<MyData>(/* ... */) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { items(data) { ListItem(it) } } }
Typowe przypadki użycia
Dekoracje elementów
W RecyclerView
działa ItemDecoration
, którego możesz użyć, by dodać specjalny rysunek do elementów na liście. Możesz na przykład dodać ItemDecoration
, aby dodać rozgraniczenia między elementami:
val itemDecoration = DividerItemDecoration(recyclerView.context, LinearLayoutManager.VERTICAL) recyclerView.addItemDecoration(itemDecoration)
Tworzenie nie ma podobnego pojęcia dekoracji elementów. Dekoracje interfejsu możesz dodać bezpośrednio do kompozycji. Aby na przykład dodać separatory do listy, możesz użyć funkcji Divider
kompozycyjnej po każdym elemencie:
LazyColumn(Modifier.fillMaxSize()) { itemsIndexed(data) { index, d -> ListItem(d) if (index != data.size - 1) { Divider() } } }
Animacje elementów
Element ItemAnimator
można ustawić w RecyclerView
, aby animować wygląd elementów po wprowadzeniu zmian w adapterze. Domyślnie RecyclerView
używa funkcji DefaultItemAnimator
, która udostępnia podstawowe animacje podczas usuwania, dodawania i przenoszenia zdarzeń.
Leniwe listy działają podobnie dzięki modyfikatorowi animateItemPlacement
.
Więcej informacji znajdziesz w artykule Animacje elementów.
Dodatkowe materiały
Więcej informacji o przenoszeniu elementu RecyclerView
do interfejsu Compose znajdziesz w tych materiałach:
- Listy i siatki: dokumentacja dotycząca wdrażania list i siatek w funkcji tworzenia wiadomości.
- Jetpack Compose Interop: korzystanie z funkcji Compose w widoku RecyclerView: post na blogu, z którego dowiesz się, jak skutecznie korzystać z funkcji Compose w obiekcie
RecyclerView
.
Polecane dla Ciebie
- Uwaga: tekst linku jest wyświetlany, gdy JavaScript jest wyłączony
- Listy i siatki
- Przenieś
CoordinatorLayout
do tworzenia - Inne uwagi