Migrar a RecyclerView para uma lista lenta

RecyclerView é um componente View que facilita a exibição eficiente de grandes conjuntos de dados. Em vez de criar visualizações para cada item no conjunto de dados, o RecyclerView melhora a performance do app mantendo um pequeno pool de visualizações e reciclando-as à medida que você rola pelos itens.

No Compose, é possível usar listas lazy para fazer a mesma coisa. Nesta página, descrevemos como migrar sua implementação do RecyclerView para usar listas Lazy no Compose.

Etapas da migração

Para migrar sua implementação do RecyclerView para o Compose, siga estas etapas:

  1. Comente ou remova o RecyclerView da hierarquia da interface e adicione um ComposeView para substituir se ainda não houver um na hierarquia. Este é 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> 
  2. Determine o tipo de elemento combinável de lista Lazy que você precisa com base no gerenciador de layout do RecyclerView (consulte a tabela abaixo). O elemento combinável selecionado será o elemento de nível superior do ComposeView adicionado na etapa anterior.

    LayoutManager

    Elemento combinável

    LinearLayoutManager

    LazyColumn ou LazyRow

    GridLayoutManager

    LazyVerticalGrid ou LazyHorizontalGrid

    StaggeredGridLayoutManager

    LazyVerticalStaggeredGrid ou LazyHorizontalStaggeredGrid

    // recyclerView.layoutManager = LinearLayoutManager(context) composeView.setContent {     LazyColumn(Modifier.fillMaxSize()) {         // We use a LazyColumn since the layout manager of the RecyclerView is a vertical LinearLayoutManager     } }

  3. Crie um elemento combinável correspondente para cada tipo de visualização na implementação de RecyclerView.Adapter. Cada tipo de visualização geralmente é mapeado para uma subclasse ViewHolder, mas nem sempre é assim. Esses combináveis serão usados como a representação da interface para diferentes tipos de elementos na sua 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() e onBindViewHolder() do seu RecyclerView.Adapter será substituída por esses elementos combináveis e pelo estado que você fornecer 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 unidos.

  4. No slot content da lista Lazy (o parâmetro lambda final), use a função items() (ou uma sobrecarga equivalente) para iterar os dados da lista. Na lambda itemContent, invoque o item 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

O RecyclerView tem o conceito de um ItemDecoration, que pode ser usado para adicionar um desenho especial para itens na lista. Por exemplo, é possível adicionar um ItemDecoration para incluir 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 decorações 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 lazy 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: