Gerenciar o estado da RecyclerView

A RecyclerView pode mostrar grandes quantidades de dados usando o mínimo de recursos gráficos. À medida que os usuários rolam os itens em uma RecyclerView, as instâncias de View dos itens que rolaram para fora da tela são reutilizadas para criar novos itens conforme eles aparecem. No entanto, mudanças de configuração, como a rotação do dispositivo, podem redefinir o estado de uma RecyclerView, forçando os usuários a rolar novamente para a posição anterior na lista de itens.

A RecyclerView precisa manter o estado, principalmente a posição de rolagem, e o estado dos elementos da lista durante todas as mudanças de configuração.

manter o estado;

Defina a política de restauração de estado da RecyclerView.Adapter para salvar a posição de rolagem da RecyclerView. Salve o estado dos itens da lista da RecyclerView. Adicione o estado dos itens da lista ao adaptador da RecyclerView e restaure o estado dos itens da lista quando eles estiverem vinculados a um ViewHolder.

1. Ativar a política de restauração de estado do Adapter

Ative a política de restauração de estado do adaptador RecyclerView para que a posição de rolagem da RecyclerView seja mantida durante as mudanças de configuração. Adicione a especificação da política ao construtor do adaptador:

Kotlin

class MyAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    init {
        stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY
    }
    ...
}

Java

class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    public Adapter() {
        setStateRestorationPolicy(StateRestorationPolicy.PREVENT_WHEN_EMPTY);
    }
    ...
}

2. Salvar o estado dos itens da lista com estado

Salve o estado de itens complexos da lista da RecyclerView, como aqueles que contêm elementos EditText. Por exemplo, para salvar o estado de uma EditText, adicione um callback semelhante a um gerenciador onClick para capturar mudanças de texto. No callback, defina quais dados serão salvos:

Kotlin

input.addTextChangedListener(
    afterTextChanged = { text ->
        text?.let {
            // Save state here.
        }
    }
)

Java

input.addTextChangedListener(new TextWatcher() {

    ...

    @Override
    public void afterTextChanged(Editable s) {
        // Save state here.
    }
});

Declare o callback na Activity ou no Fragment. Use um ViewModel para armazenar o estado.

3. Adicionar o estado dos itens da lista ao Adapter

Adicione o estado dos itens da lista a RecyclerView.Adapter. Transmita o estado do item ao construtor do adaptador quando a Activity ou o Fragment do host forem criados:

Kotlin

val adapter = MyAdapter(items, viewModel.retrieveState())

Java

MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());

4. Recuperar o estado dos itens da lista no ViewHolder do adaptador

Na RecyclerView.Adapter, restaure o estado de um item ao vincular um ViewHolder a ele:

Kotlin

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    ...
    val item = items[position]
    val state = states.firstOrNull { it.item == item }

    if (state != null) {
        holder.restore(state)
    }
}

Java

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    ...
    Item item = items[position];
    Arrays.stream(states).filter(state -> state.item == item)
        .findFirst()
        .ifPresent(state -> holder.restore(state));
}

Pontos principais

Resultados

A RecyclerView agora pode restaurar a posição de rolagem e o estado de cada item na lista da RecyclerView.

Coleções que contêm este guia

Este guia faz parte destas coleções selecionadas de guias rápidos que abrangem objetivos mais amplos de desenvolvimento para Android:

Permita que seu app ofereça suporte a uma experiência do usuário otimizada em tablets, dispositivos dobráveis e ChromeOS.

Tem dúvidas ou feedback?

Acesse a página de perguntas frequentes e saiba mais sobre os guias rápidos ou entre em contato e conte o que você pensa.