Adeus ListView — RecyclerView

Um guia para implementar o RecyclerView

Renan Ferreira
Android Dev BR

--

(apressado) ? demo :

O RecyclerView é uma nova (nem tanto) view que veio para substituir o ListView e o GridView. De acordo com sua documentação, trata-se de um widget mais avançado e eficiente, quando comparado aos seus antecessores, e que apresenta diversas simplificações para suportar animações e diferentes disposições de elementos.

Uma View mais simples, entretanto mais poderosa

Para oferecer todas estas otimizações, a Google decidiu simplificar o elemento. Pode parecer estranho, mas o RecyclerView possui um nível de responsabilidade menor quando comparado ao ListView. Em teoria, o widget é apenas um container que encapsula um LayoutManager e um ItemAnimator, e que se comunica com um Adapter, mais precisamente, um RecyclerView.Adapter.

Diagrama de funcionamento do RecyclerView (fonte)

“Renan, não entendi nada!” Não lhe culpo, vamos por partes.

Inclua a dependência

O RecyclerView foi introduzido junto com o Android Lollipop, entretanto ele é distribuído a partir da biblioteca de suporte, de modo a possibilitar o seu uso em dispositivos já datados, Android 2.1.x em diante.

LayoutManager

Ao contrário do ListView, o RecyclerView não possui a responsabilidade de posicionar os elementos na lista, e, ao contrário do que o nome indica, ele também não possui a função de reutilizar as views que não estão mais visíveis para o usuário. São os LayoutManagers que apresentam esta função.

Este desacoplamento permite que o RecyclerView seja utilizado para diferentes layouts, como por exemplo para uma lista vertical de itens ou até para a construção de grids.

Atualmente, o componente apresenta três LayoutManagers:

  • LinearLayoutManager: para a construção de listas verticais ou horizontais;
  • GridLayoutManager: para a construção de Grids;
  • StaggeredGridLayoutManager: para a construção de Grids nos quais cada item pode apresentar tamanhos variados, criando uma espécie de mosaico.

Um exemplo de utilização do LinearLayoutManager seria:

Caso seu desejo seja a criação de um Grid, ao invés de uma lista, basta modificar o LayoutManager:

Importante notar que o construtor do GridLayoutManager apresenta como segundo parâmetro o número de colunas que o Grid possuirá.

RecyclerView.Adapter

Esqueça o ArrayAdapter e/ou BaseAdapter. Caso você utilize o RecyclerView em suas listas, você precisará estender esta classe. Uma grande vantagem deste novo adapter é a obrigatoriedade de se utilizar um ViewHolder. Este é um padrão estimulado pela Google que melhora a performance das listas, uma vez que o mesmo cria um "cache" das views, evitando algumas operações de findViewById(…) que impactam muito a fluidez do scroll. Com o ListView, eram necessários alguns ajustes, ou melhor, algumas gambiarras, para implementar o padrão.

Como o RecyclerView foi concebido tendo em mente a utilização dos ViewHolders, o RecyclerView.Adapter demonstra uma implementação mais simples e de fácil entendimento, eliminando um pouco a preocupação do desenvolvedor em tratar casos de reutilização das views de cada item.

De forma geral, você deve implementar três métodos em seu adapter:

  • getItemCount: retorna o número de elementos presentes na lista de dados;
  • onCreateViewHolder: retorna uma nova instância do viewHolder;
  • onBindViewHolder: inclui os dados em cada item da lista.

Para exemplificar, vamos primeiramente criar um adapter que será responsável por uma lista de pessoas, representado pelo Model “Person”.

Logo, implementa-se o ViewHolder, que se trata apenas uma classe estática que apresenta uma referência para as views presentes em cada linha da nossa lista. Importante perceber que, ao contrário do ViewHolder utilizado para as ListViews, o RecyclerView já apresenta uma implementação do padrão, o RecyclerView.ViewHolder, que deve ser herdado para a definição de novos ViewHolders.

Por último, atrelamos o adapter ao RecyclerView, presente na Activity ou Fragment:

ItemAnimator

O ItemAnimator é o responsável por animar qualquer notificação enviada para o Adapter, consequentemente, eventos de remoção e adição de itens da lista podem ser animados, caso se indique para o RecyclerView uma implementação de um ItemAnimator.

Para simplificar, o RecyclerView já provê algumas animações padrões, e para isso, basta substituir o famoso método notifyDataSetChanged do adapter pelos seguintes:

  • notifyItemInserted(int position): para indicar a inserção de um novo item na posição indicada;
  • notifyItemRemoved(int position): para indicar a remoção de um item presente na posição indicada.

Desta forma, um exemplo de adição de elementos em uma lista poderia ser:

Demo

Referências

Imagens:

http://abduzeedo.com/google-material-design-printed-kit-manual

--

--