RecyclerView
é um componente de visualização que facilita a exibição eficiente
de grandes conjuntos de dados. Em vez de criar visualizações para cada item no conjunto de dados,
RecyclerView
melhora o desempenho do app mantendo um pequeno conjunto de
visualizações e reciclando-as conforme você rola os itens.
No Compose, é possível usar listas lentas para fazer o mesmo. Esta página
descreve como migrar a implementação de RecyclerView
para usar listas Lazy
no Compose.
Etapas da migração
Para migrar a implementação de RecyclerView
para o Compose, siga estas etapas:
Comente ou remova o
RecyclerView
da hierarquia da interface e adicione umComposeView
para substituí-lo, se ainda não houver nenhum na hierarquia. Esse é o contêiner da lista Lazy que você vai adicionar:<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>
Determine que tipo de elemento combinável de lista preguiçosa você precisa com base no gerenciador de layout do
RecyclerView
(consulte a tabela abaixo). O elemento combinável selecionado será o elemento combinável de nível superior doComposeView
que você adicionou na etapa anterior.LayoutManager
Elemento combinável
LinearLayoutManager
LazyColumn
ouLazyRow
GridLayoutManager
LazyVerticalGrid
ouLazyHorizontalGrid
StaggeredGridLayoutManager
LazyVerticalStaggeredGrid
ouLazyHorizontalStaggeredGrid
// recyclerView.layoutManager = LinearLayoutManager(context) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { // We use a LazyColumn since the layout manager of the RecyclerView is a vertical LinearLayoutManager } }
Crie um elemento combinável correspondente para cada tipo de visualização na implementação de
RecyclerView.Adapter
. Cada tipo de visualização geralmente é associado a uma subclasseViewHolder
, mas isso nem sempre acontece. Esses combináveis serão usados como a representação da interface para diferentes tipos de elementos na lista:@Composable fun ListItem(data: MyData, modifier: Modifier = Modifier) { Row(modifier.fillMaxWidth()) { Text(text = data.name) // … other composables required for displaying `data` } }
A lógica nos métodos
onCreateViewHolder()
eonBindViewHolder()
doRecyclerView.Adapter
será substituída por esses elementos combináveis e pelo estado fornecido a eles. No Compose, não há separação entre criar um elemento combinável para um item e vincular dados a ele. Esses conceitos são combinados.No slot
content
da lista Lazy (o parâmetro lambda final), use a funçãoitems()
(ou uma sobrecarga equivalente) para iterar os dados da lista. Na lambdaitemContent
, invoque o elemento combinável adequado para seus dados:val data = listOf<MyData>(/* ... */) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { items(data) { ListItem(it) } } }
Casos de uso comuns
Decorações de itens
RecyclerView
tem o conceito de ItemDecoration
, que pode ser usado para adicionar um
desenho especial para itens na lista. Por exemplo, é possível adicionar um
ItemDecoration
para adicionar divisores entre os itens:
val itemDecoration = DividerItemDecoration(recyclerView.context, LinearLayoutManager.VERTICAL) recyclerView.addItemDecoration(itemDecoration)
O Compose não tem um conceito equivalente de decorações de itens. Em vez disso, você
pode adicionar qualquer decoração de interface na lista diretamente na composição. Por exemplo,
para adicionar divisores à lista, use o elemento combinável Divider
após cada
item:
LazyColumn(Modifier.fillMaxSize()) { itemsIndexed(data) { index, d -> ListItem(d) if (index != data.size - 1) { HorizontalDivider() } } }
Animações de itens
Um ItemAnimator
pode ser definido em um RecyclerView
para animar a aparência dos
itens à medida que as mudanças são feitas no adaptador. Por padrão, o RecyclerView
usa
DefaultItemAnimator
, que fornece animações básicas em eventos de remoção, adição e
movimentação.
As listas preguiçosas têm um conceito semelhante com o modificador animateItemPlacement
.
Consulte Animações de itens para saber mais.
Outros recursos
Para mais informações sobre como migrar um RecyclerView
para o Compose, consulte os
recursos a seguir:
- Listas e grades: documentação sobre como implementar listas e grades no Compose.
- Interoperabilidade do Jetpack Compose: como usar o Compose em uma RecyclerView (em inglês):
postagem do blog para usar o Compose de forma eficiente em uma
RecyclerView
.
Recomendados para você
- Observação: o texto do link aparece quando o JavaScript está desativado.
- Listas e grades
- Migrar
CoordinatorLayout
para o Compose - Outras considerações