RecyclerViewAdapter Genéricos

Amaro Virginio da Silva Neto
iFood Tech
Published in
4 min readMar 23, 2020

Como reutilizar adapter no Android com Kotlin + Data Binding + Filterable

Se você trabalha há algum tempo com desenvolvimento Android e tem que fazer listas com o RecyclerView, já deve ter se deparado com uma atividade recorrente: criar RecyclerViewAdapters para cada uma das classes que deseja transformar em lista.

Se seu aplicativo tem uma lista de carros, animais, plantas e lugares, você vai precisar criar um adapter para cada um deles. Isso é um trabalho repetitivo, porém através do Jetpack do Android, podemos facilitar, e muito, o nosso desenvolvimento.

Imagine conseguir, com um único adapter, fazer listas para diferentes classes.

Neste artigo, vou mostrar uma implementação de um ReyclerViewAdapter genérico, facilitando sua reutilização. Para isso, usaremos Kotlin, Data Binding e Filterable para implementá-lo.

Eu estou assumindo que você já tenha alguma experiência em usar RecyclerView, Data Binding e Filterable, mas não se preocupe caso não tenha, aqui estão alguns artigos que podem ajudar você a entender melhor esses assuntos:

Codificando

Como exemplo, vou fazer uma lista de filmes que pode ser filtrada por título, ano, diretor e estúdio.

A primeira coisa que se deve fazer é definir uma interface para todos os objetos que vai ser transformada numa lista de RecyclerView utilizando um RecyclerViewAdapter genérico.

Na interface AdapterObject, são definidas duas funções:

  • layoutId: retornar o id do xml que define o layout do seu objeto no RecyclerView.
  • isFilterable: define os critérios de validação para o search (pesquisa) na lista.

Agora vamos criar a classe Movie. Ela deve implementar a interface AdapterObject.

Note que a função isFilterable retorna true caso o title, year, director ou studio contenha a string de filter.

Depois é definido um layout para os itens da lista de filmes. Um arquivo xml chamado movie_item_list foi criado na pasta res/layout com a tag layout para implementar o data binding. Uma variável chamada model foi definida para ligar com o nosso objeto Movie e usar nos TextViews do arquivo.

Vamos à parte mais interessante deste projeto: criar o RecyclerViewAdapter genérico.

Não precisa se assustar, vou explicar parte por parte.

A classe GenericAdapter vai receber uma lista genérica de objetos da interface AdapterObject.

Um listener é criado para que os cliques no RecyclerView sejam enviados para o Fragment/Activity.

No onCreateViewHolder, utilizando o bind do DataBindingUtil, criou-se um ViewHolder com o ViewDataBinding.

No onBindViewHolder, é extraído o objeto que deve-se mapear da lista do adapter, ligando esse objeto ao data binding holder através do `setVariable`, por fim chamando o `executePendingBindings`. É também nessa função que colocamos o AppAdapterListener no holder.

Sobrescreve-se a função `getItemViewType` para que cada objeto do AdapterObject seja inflado com seu layout específico, definido dentro da classe que implementa o AdapterObject.

Por fim é criado o ViewHolder dessa classe. Ele recebe um ViewDataBinding e implementa uma função para retornar à atual View que será usada no onBindViewHolder.

Pronto agora você já tem um adapter genérico. 😊

Adicionando um Filter

Vamos adicionar um Filter porque é muito comum você criar uma lista e colocar um search para buscar itens.

Adicione a interface Filterable na classe GenericAdapter e sobrescreva a função getFilter():

Agora vamos para explicação.
Na implementação da interface Filter, em `performFiltering`, é verificado inicialmente se está buscando por uma string vazia. Se a string estiver vazia, devemos retornar à lista original, e caso contrário, toda lista do RecyclerView será percorrida executando a função `isFilterable` para cada item com o parâmetro da string de busca. Se essa condição for verdadeira, adicionamos o item no searchResult.

Por fim, na função `publishResult`, que recebe a lista de itens filtrada, adiciona os itens na lista principal do adapter e notifica o RecyclerView de que seus itens foram atualizados.

Ufa! Quase lá pessoal, só falta chamar na Activity!

Usando seu Adapter Genérico

Na sua Activity você deve implementar a interface GenericAdapter.AppAdapterListener<Movie>.

Para utilizar nosso adapter genérico, basta criar um GenericAdapter passando a lista de objetos que deseja ser mostrado na RecyclerView. Lembrando que esses objetos devem implementar a interface AdapterObject, adicionando o listener e o adapter no seu RecyclerView.

Para adicionar o filtro no seu searchView implemente o SearchView.OnQueryTextListener e sobrescreva `onQueryTextSubmit` e o `onQueryTextChange` passando a query de busca no filter do adapter.

Resultado

Feito da forma tradicional, se você fizesse uma lista para Movies, Actors e Directors teria que fazer um adapter para cada um.

E agora, com apenas um adapter e classes que implementem o AdapterObject, você diminuiu o boilerplate e o tempo de desenvolvimento do seu projeto Android!

Enjoy! 😊

Quer receber conteúdos exclusivos criados pelos nossos times de tecnologia? Inscreva-se.

Código completo aqui :

--

--