Partilhar via


RecyclerExibir partes e funcionalidades

RecyclerView manipula algumas tarefas internamente (como rolagem e reciclagem de exibições), mas é essencialmente um gerente que coordena classes auxiliares para exibir uma coleção. RecyclerView delega tarefas para as seguintes classes auxiliares:

  • Adapter – Infla layouts de item (instancia o conteúdo de um arquivo de layout) e associa dados a exibições exibidas em um RecyclerView. O adaptador também relata eventos de clique em item.

  • LayoutManager – Mede e posiciona exibições de itens dentro de um RecyclerView e gerencia a política de reciclagem de exibição.

  • ViewHolder – Pesquisa e armazena referências de exibição. O titular da exibição também ajuda a detectar cliques de exibição de item.

  • ItemDecoration – Permite que um aplicativo adicione deslocamentos especiais de desenho e layout a modos de exibição específicos para divisores de desenho entre itens, realces e limites de agrupamento visual.

  • ItemAnimator – Define as animações que ocorrem durante as ações do item ou conforme as alterações são feitas no adaptador.

A relação entre as RecyclerViewclasses , LayoutManagere Adapter é descrita no diagrama a seguir:

Diagrama de RecyclerView que contém LayoutManager, usando o Adaptador para acessar o Conjunto de Dados

Como ilustra essa figura, o LayoutManager pode ser considerado como o intermediário entre o Adapter e o RecyclerView. O LayoutManager faz chamadas em Adapter métodos em nome do RecyclerView. Por exemplo, o LayoutManager chama um Adapter método quando é hora de criar uma nova exibição para uma posição de item específica no RecyclerView. O Adapter infla o layout desse item e cria uma ViewHolder instância (não mostrada) para armazenar em cache as referências às exibições nessa posição. Quando o LayoutManager chama para Adapter associar um item específico ao conjunto de dados, o Adapter localiza os dados desse item, recupera-os do conjunto de dados e copia-os para a exibição de item associada.

Ao usar RecyclerView em seu aplicativo, é necessário criar tipos derivados das seguintes classes:

  • RecyclerView.Adapter – Fornece uma associação do conjunto de dados do aplicativo (que é específico para seu aplicativo) para exibições de item exibidas dentro do RecyclerView. O adaptador sabe como associar cada posição de exibição de item no RecyclerView a um local específico na fonte de dados. Além disso, o adaptador manipula o layout do conteúdo em cada exibição de item individual e cria o titular da exibição para cada exibição. O adaptador também relata eventos de clique em item detectados pelo modo de exibição de item.

  • RecyclerView.ViewHolder – Armazena em cache referências aos modos de exibição no arquivo de layout de item para que as pesquisas de recursos não sejam repetidas desnecessariamente. O titular do modo de exibição também organiza eventos de clique em item a serem encaminhados para o adaptador quando um usuário toca no modo de exibição de item associado do titular do modo de exibição.

  • RecyclerView.LayoutManager – Posiciona itens dentro do RecyclerView. Você pode usar um dos vários gerenciadores de layout predefinidos ou implementar seu próprio gerenciador de layout personalizado. RecyclerView delega a política de layout ao gerenciador de layout, para que você possa conectar um gerenciador de layout diferente sem precisar fazer alterações significativas em seu aplicativo.

Além disso, opcionalmente, você pode estender as seguintes classes para alterar a aparência de RecyclerView em seu aplicativo:

  • RecyclerView.ItemDecoration
  • RecyclerView.ItemAnimator

Se você não estender ItemDecoration e ItemAnimator, RecyclerView usará implementações padrão. Este guia não explica como criar classes e personalizadasItemDecoration. Para obter mais informações sobre essas classes, consulte RecyclerView.ItemDecoration e RecyclerView.ItemAnimator.ItemAnimator

Como funciona a reciclagem de exibição

RecyclerView não aloca uma exibição de item para cada item em sua fonte de dados. Em vez disso, ele aloca apenas o número de exibições de item que cabem na tela e reutiliza esses layouts de item à medida que o usuário rola. Quando a exibição sai da vista pela primeira vez, ela passa pelo processo de reciclagem ilustrado na figura a seguir:

Diagrama ilustrando as seis etapas da reciclagem de exibição

  1. Quando uma exibição rola para fora da vista e não é mais exibida, ela se torna uma exibição de recorte.

  2. O modo de exibição de recorte é colocado em um pool e se torna uma exibição de reciclagem. Esse pool é um cache de exibições que exibem o mesmo tipo de dados.

  3. Quando um novo item deve ser exibido, uma exibição é retirada do pool de reciclagem para reutilização. Como essa exibição deve ser vinculada novamente pelo adaptador antes de ser exibida, ela é chamada de exibição sujo.

  4. A exibição sujo é reciclada: o adaptador localiza os dados do próximo item a ser exibido e copia esses dados para as exibições deste item. As referências para essas exibições são recuperadas do titular da exibição associado à exibição reciclada.

  5. A exibição reciclada é adicionada à lista de itens no RecyclerView que estão prestes a entrar na tela.

  6. A exibição reciclada fica na tela enquanto o usuário rola o RecyclerView para o próximo item na lista. Enquanto isso, outra exibição rola para fora da vista e é reciclada de acordo com as etapas acima.

Além da reutilização de exibição de item, RecyclerView também usa outra otimização de eficiência: portadores de exibição. Um titular de exibição é uma classe simples que armazena em cache referências de exibição. Sempre que o adaptador infla um arquivo de layout de item, ele também cria um suporte de exibição correspondente. O titular do modo de exibição usa FindViewById para obter referências aos modos de exibição dentro do arquivo de layout de item inflado. Essas referências são usadas para carregar novos dados nas exibições sempre que o layout é reciclado para mostrar novos dados.

O Gerenciador de Layout

O gerenciador de layout é responsável por posicionar itens na RecyclerView exibição; ele determina o tipo de apresentação (uma lista ou uma grade), a orientação (se os itens são exibidos vertical ou horizontalmente) e quais itens de direção devem ser exibidos (em ordem normal ou em ordem inversa). O gerenciador de layout também é responsável por calcular o tamanho e a posição de cada item na exibição RecycleView .

O gerenciador de layout tem uma finalidade adicional: determina a política de quando reciclar exibições de item que não estão mais visíveis para o usuário. Como o gerenciador de layout está ciente de quais modos de exibição estão visíveis (e quais não estão), ele está na melhor posição para decidir quando uma exibição pode ser reciclada. Para reciclar uma exibição, o gerenciador de layout normalmente faz chamadas ao adaptador para substituir o conteúdo de uma exibição reciclada por dados diferentes, conforme descrito anteriormente em Como funciona a reciclagem de exibição.

Você pode estender RecyclerView.LayoutManager para criar seu próprio gerenciador de layout ou usar um gerenciador de layout predefinido. RecyclerView fornece os seguintes gerenciadores de layout predefinidos:

  • LinearLayoutManager – Organiza itens em uma coluna que podem ser rolados verticalmente ou em uma linha que pode ser rolada horizontalmente.

  • GridLayoutManager – Exibe itens em uma grade.

  • StaggeredGridLayoutManager – Exibe itens em uma grade escalonada, em que alguns itens têm alturas e larguras diferentes.

Para especificar o gerenciador de layout, crie uma instância do gerenciador de layout escolhido e passe-o para o SetLayoutManager método . Observe que você deve especificar o gerenciador de layout – RecyclerView não seleciona um gerenciador de layout predefinido por padrão.

Para obter mais informações sobre o gerenciador de layout, consulte a referência da classe RecyclerView.LayoutManager.

O Titular do Modo de Exibição

O titular da exibição é uma classe que você define para referências de exibição de cache. O adaptador usa essas referências de exibição para associar cada exibição ao seu conteúdo. Cada item no tem uma instância de titular de RecyclerView exibição associada que armazena em cache as referências de exibição para esse item. Para criar um titular de exibição, use as seguintes etapas para definir uma classe para manter o conjunto exato de exibições por item:

  1. Subclasse RecyclerView.ViewHolder.
  2. Implemente um construtor que procure e armazene as referências de exibição.
  3. Implemente as propriedades que o adaptador pode usar para acessar essas referências.

Um exemplo detalhado de uma ViewHolder implementação é apresentado em Um exemplo de RecyclerView básico. Para obter mais informações sobre RecyclerView.ViewHolder, consulte a referência da classe RecyclerView.ViewHolder.

O adaptador

A maior parte do "trabalho pesado" do RecyclerView código de integração ocorre no adaptador. RecyclerView exige que você forneça um adaptador derivado de RecyclerView.Adapter para acessar sua fonte de dados e preencher cada item com conteúdo da fonte de dados. Como a fonte de dados é específica do aplicativo, você deve implementar a funcionalidade do adaptador que entenda como acessar seus dados. O adaptador extrai informações da fonte de dados e as carrega em cada item da RecyclerView coleção.

O desenho a seguir ilustra como o adaptador mapeia o conteúdo em uma fonte de dados por meio de portadores de exibição para exibições individuais dentro de cada item de linha no RecyclerView:

Diagrama ilustrando o adaptador que conecta a fonte de dados a ViewHolders

O adaptador carrega cada RecyclerView linha com dados para um item de linha específico. Para a posição da linha P, por exemplo, o adaptador localiza os dados associados na posição P na fonte de dados e copia esses dados para o item de linha na posição P da RecyclerView coleção. No desenho acima, por exemplo, o adaptador usa o suporte de exibição para pesquisar as referências para o ImageView e TextView nessa posição para que ele não precise chamar FindViewById repetidamente para esses modos de exibição à medida que o usuário rola pela coleção e reutiliza as exibições.

Ao implementar um adaptador, você deve substituir os seguintes RecyclerView.Adapter métodos:

  • OnCreateViewHolder – Cria uma instância do arquivo de layout do item e do titular da exibição.

  • OnBindViewHolder – Carrega os dados na posição especificada nas exibições cujas referências são armazenadas no titular da exibição especificado.

  • ItemCount – retorna o número de itens na fonte de dados.

O gerenciador de layout chama esses métodos enquanto ele está posicionando itens dentro do RecyclerView.

Notificando o RecyclerView sobre alterações de dados

RecyclerView não atualiza automaticamente sua exibição quando o conteúdo de sua fonte de dados é alterado; o adaptador deve notificar RecyclerView quando há uma alteração no conjunto de dados. O conjunto de dados pode ser alterado de várias maneiras; por exemplo, o conteúdo dentro de um item pode ser alterado ou a estrutura geral dos dados pode ser alterada. RecyclerView.Adapter fornece uma série de métodos que você pode chamar para que RecyclerView responda às alterações de dados da maneira mais eficiente:

  • NotifyItemChanged – Sinaliza que o item na posição especificada foi alterado.

  • NotifyItemRangeChanged – Sinaliza que os itens no intervalo de posições especificado foram alterados.

  • NotifyItemInserted – Sinaliza que o item na posição especificada foi inserido recentemente.

  • NotifyItemRangeInserted – Sinaliza que os itens no intervalo de posições especificado foram inseridos recentemente.

  • NotifyItemRemoved – Sinaliza que o item na posição especificada foi removido.

  • NotifyItemRangeRemoved – Sinaliza que os itens no intervalo de posições especificado foram removidos.

  • NotifyDataSetChanged – Sinaliza que o conjunto de dados foi alterado (força uma atualização completa).

Se você souber exatamente como o conjunto de dados foi alterado, poderá chamar os métodos apropriados acima para atualizar RecyclerView da maneira mais eficiente. Se você não souber exatamente como o conjunto de dados foi alterado, poderá chamar NotifyDataSetChanged, o que é muito menos eficiente porque RecyclerView deve atualizar todas as exibições visíveis para o usuário. Para obter mais informações sobre esses métodos, consulte RecyclerView.Adapter.

No próximo tópico, Um Exemplo de RecyclerView Básico, um aplicativo de exemplo é implementado para demonstrar exemplos de código reais das partes e da funcionalidade descritas acima.