Adeus ListView —  Um guia para implementar o RecyclerView

O RecyclerView é uma nova (mas 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 e 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.

renan 1

“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.

 <pre=”java”> dependencies { … compile ‘com.android.support:recyclerview-v7:22.2.1’ }

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: 

<pre lang=”java”>mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
mRecyclerView.setHasFixedSize(true);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(layoutManager);</pre>

Caso seu desejo seja a criação de um Grid, ao invés de uma lista, basta modificar o LayoutManager:https://gist.github.com/relferreira/d5a96c82c4434bba25aa

https://gist.github.com/relferreira/e55ba20a7bbd01c3252f

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 dosViewHolders, 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”.

 

https://gist.github.com/relferreira/23f4980525635afb1d3d 

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.

 

https://gist.github.com/relferreira/e859f314e82e6914e550

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

https://gist.github.com/relferreira/a698b2c19682f09f8c43

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:

https://gist.github.com/relferreira/c72e1c5d052cfd7dac17

DEMO 

 

renan 2

 

Todos os códigos estão disponíveis em: https://github.com/relferreira/recyclerview 

Referências
http://abduzeedo.com/google-material-design-printed-kit-manual (Imagens)
Por: Renan Lopes Ferreira
Revisão: Jéssica Saliba 
 

 

Deixe um comentário