Personalização avançada do RecyclerView   Parte do Android Jetpack.

Você pode personalizar os objetos RecyclerView para atender às suas necessidades específicas. As classes padrão descritas na seção Criar listas dinâmicas com o RecyclerView fornecem toda a funcionalidade que a maioria dos desenvolvedores precisa. E em muitos casos, a única personalização que você precisa fazer é projetar a visualização para cada fixador de visualização e criar o código para atualizar essas visualizações com os dados apropriados. No entanto, se seu app tiver requisitos específicos, você poderá modificar o comportamento padrão de várias maneiras. Esta página descreve algumas das outras possibilidades de personalizações.

Como modificar o layout

O RecyclerView usa um gerenciador de layout para posicionar os itens individuais na tela e determinar quando reutilizar visualizações de itens que não estão mais visíveis para o usuário. Para reutilizar (ou reciclar) uma visualização, um gerenciador de layout pode solicitar que o adaptador substitua o conteúdo da visualização por um elemento diferente do conjunto de dados. Reciclar visualizações dessa maneira melhora o desempenho, evitando a criação de visualizações desnecessárias ou a realização de pesquisas findViewById() caras. A Biblioteca de Suporte do Android inclui três gerenciadores de layout padrão, e cada um deles oferece muitas opções de personalização:

Se nenhum desses gerenciadores de layout atende às suas necessidades, você pode criar um gerenciador próprio, estendendo a classe abstrata RecyclerView.LayoutManager.

Adicionar animações de itens

Sempre que um item muda, o RecyclerView usa um animador para alterar a aparência dele. Esse animador é um objeto que estende a classe RecyclerView.ItemAnimator abstrata. Por padrão, o RecyclerView usa DefaultItemAnimator para fornecer a animação. Para fornecer animações personalizadas, defina um objeto animador próprio, estendendo RecyclerView.ItemAnimator.

Ativar a seleção de itens de lista

A biblioteca recyclerview-selection permite que os usuários selecionem itens na lista RecyclerView usando a entrada por toque ou mouse. Você mantém o controle sobre a apresentação visual de um item selecionado. Você também pode manter o controle sobre as políticas que controlam o comportamento de seleção, por exemplo, itens que podem ser qualificados para seleção e quantos itens podem ser selecionados.

Para adicionar suporte de seleção a uma instância do RecyclerView, siga estas etapas:

  1. Determine qual tipo de chave de seleção usar e crie um ItemKeyProvider.

    Você pode usar três tipos de chave para identificar itens selecionados: Parcelable (e todas as subclasses, como Uri), String e Long. Para ver informações detalhadas sobre os tipos de chave de seleção, consulte SelectionTracker.Builder.

  2. Implemente ItemDetailsLookup.
  3. ItemDetailsLookup permite que a biblioteca de seleção acesse informações sobre itens RecyclerView que receberam MotionEvent. Ele é efetivamente uma fábrica para instâncias de ItemDetails que são armazenadas em backup por (ou extraídas de) uma instância de RecyclerView.ViewHolder.

  4. Atualize o item Views em RecyclerView para indicar que ele foi selecionado ou desmarcado pelo usuário.

    A biblioteca de seleção não fornece uma decoração visual padrão para os itens selecionados. Você precisa fornecer isso quando implementar onBindViewHolder(). A abordagem recomendada é a seguinte:

  5. Use ActionMode para fornecer ao usuário ferramentas para executar uma ação na seleção.
  6. Registre um SelectionTracker.SelectionObserver para ser notificado quando a seleção mudar. Quando uma seleção for criada pela primeira vez, inicie ActionMode para representar isso para o usuário e forneça ações específicas para a seleção. Por exemplo, você pode adicionar um botão "Excluir" à barra ActionMode e conectar a seta "Voltar" à barra para limpar a seleção. Quando a seleção ficar vazia (se o usuário limpou a seleção pela última vez), não se esqueça de encerrar o modo de ação.

  7. Realizar ações secundárias interpretadas
  8. No final do pipeline de processamento de eventos, a biblioteca pode determinar que o usuário está tentando ativar um item tocando nele ou tentando arrastar e soltar um item ou conjunto de itens selecionados. Reaja a essas interpretações registrando o listener apropriado. Para mais informações, consulte: SelectionTracker.Builder.

  9. Montar tudo com SelectionTracker.Builder
  10. O exemplo a seguir mostra como juntar essas partes usando a tecla de seleção Long:

    Kotlin

    var tracker = SelectionTracker.Builder(
        "my-selection-id",
        recyclerView,
        StableIdKeyProvider(recyclerView),
        MyDetailsLookup(recyclerView),
        StorageStrategy.createLongStorage())
            .withOnItemActivatedListener(myItemActivatedListener)
            .build()
    

    Java

    SelectionTracker tracker = new SelectionTracker.Builder<>(
            "my-selection-id",
            recyclerView,
            new StableIdKeyProvider(recyclerView),
            new MyDetailsLookup(recyclerView),
            StorageStrategy.createLongStorage())
            .withOnItemActivatedListener(myItemActivatedListener)
            .build();
    

    Para criar uma instância de SelectionTracker, seu app precisa fornecer o mesmo RecyclerView.Adapter que você usou para inicializar RecyclerView para SelectionTracker.Builder. Por esse motivo, você provavelmente precisará injetar a instância de SelectionTracker, uma vez criada, no seu RecyclerView.Adapter depois que RecyclerView.Adapter for criado. Caso contrário, você não poderá verificar o status selecionado de um item com o método onBindViewHolder().

  11. Inclua seleção nos eventos de ciclo de vida da atividade.
  12. Para preservar o estado de seleção em todos os eventos de ciclo de vida da atividade, seu app precisa chamar os métodos onSaveInstanceState() e onRestoreInstanceState() do rastreador de seleção dos métodos onSaveInstanceState() e onRestoreInstanceState() da atividade, respectivamente. Seu app também precisa fornecer um ID de seleção exclusivo para o construtor SelectionTracker.Builder. Esse ID é obrigatório, porque uma atividade ou um fragmento pode ter mais de uma lista distinta e selecionável, e todos precisam ser mantidos no estado salvo.

    Outros recursos

    RecyclerView é usado no app de demonstração Sunflower (link em inglês).