SlideShare uma empresa Scribd logo
SelectionTracker Para Seleção de
Itens no RecyclerView Android
thiengo.com.br
Qual o objetivo da biblioteca SelectionTracker?
Primeiro é importante lembrar que o RecyclerView, ao menos quando nos primeiros contatos, não é nada
trivial como um ListView ou um GridView.
Partindo desse ponto já temos que colocar um algoritmo de marcação de itens, único ou múltiplos, se torna
algo ainda menos simples.
O time do Google Android liberou a biblioteca SelectionTracker com o objetivo de facilitar a inclusão da
funcionalidade de seleção de itens no RecyclerView. A biblioteca foi liberada em 2018 junto ao sucessor
da Support Library, o AndroidX.
Com a SelectionTracker é também possível:
• Escolher como os itens podem ser selecionados:
• Toque / clique;
• Gesto específico;
• Drag.
• Definir quais e quantos itens podem ser selecionados;
• Ter fácil acesso aos itens selecionados.
Mas, como desenvolvedor Android que somos, sabemos que nem tudo "são flores”.
Caso você precise de algo muito simples, a marcação de um único item em lista, por exemplo, você
provavelmente achará o número de classes necessárias, para a configuração de um objeto
SelectionTracker, uma escolha em demasiado.
Conhecer o RecyclerView é necessário
Antes de continuar, caso você ainda não conheça o RecyclerView, a seguir deixo
dois links do Blog onde somente falo sobre este framework de lista, que por sinal é
o melhor framework de lista disponível no Android:
• RecyclerView, Material Design Android - Parte 2;
• Animação, onLongPress e GridLayoutManager em RecyclerView, Material
Design Android - Parte 3.
Apesar de os conteúdos indicados serem parte de uma Play List, eles são
passíveis de serem compreendidos sem que o vídeo 1 da Play List, sobre o
Toolbar, seja assistido.
O vinculo da SelectionTracker
A biblioteca SelectionTracker vem em um diferente pacote do que contém o RecyclerView. Há
também um "melhor roteiro" para adicionarmos a biblioteca a algum projeto.
O roteiro de vinculação da SelectionTracker, indicado pela documentação oficial, é como a seguir:
• Primeiro desenvolva a configuração de lista do projeto, utilizando RecyclerView, lista de dados
e adapter;
• Logo após adicione a referência da SelectionTracker no Gradle Nível de Aplicativo;
• Então implemente uma versão da classe abstrata ItemKeyProvider;
• Depois implemente uma versão da classe abstrata ItemDetailsLookup;
• Assim implemente uma versão da ItemDetails, outra classe abstrata;
• Implemente também uma SelectionPredicate;
• Atualize o código do adapter do RecyclerView para conter um objeto SelectionTracker e
também o algoritmo de mudança de UI dos itens selecionados / não selecionados;
• Inicialize um objeto SelectionTracker e vincule ele ao RecyclerView alvo.
Para lhe animar: apesar da extensa lista acima para uma única funcionalidade, a maioria dos códigos
são boilerplate, somente têm de estar no projeto, não exigindo esforço de lógica.
O primeiro tópico da lista acima é implementado no projeto de exemplo na segunda parte do artigo no
Blog. Aqui nos slides vamos direto ao estudo da biblioteca SelectionTracker.
Classe de exemplo
Antes de partirmos para os códigos oficiais da SelectionTracker, vamos a uma
simples classe de domínio que utilizaremos como referência.
Segue classe Car:
Instalação da biblioteca
A SelectionTracker foi adicionada ao Android junto ao pacote AndroidX, mas nós
também temos uma versão dela na Support Library, que é exatamente a que
utilizaremos aqui enquanto ainda não temos um conteúdo no Blog sobre a
AndroidX.
No Gradle Nível de Aplicativo, build.gradle (Module: app), adicione:
Na época da construção deste conteúdo a versão estável mais atual era a 28.0.0.
Implementando a ItemKeyProvider
A classe abstrata ItemKeyProvider é a entidade que fornece acesso as chaves estáveis
dos itens, acesso interno à biblioteca SelectionTracker.
Resumidamente: uma "chave estável" é um identificador que se mantém o mesmo
independente da mudança de posição ou mudança de propriedade de um objeto.
Um exemplo simples de chave estável é o ID de um usuário em banco de dados. Podemos
mudar alguns atributos do usuário, como a idade dele, mas o ID se manterá o mesmo.
Essas chaves de acesso, que são possíveis via implementação de uma ItemKeyProvider,
são o primeiro ponto que permite que internamente a biblioteca SelectionTracker tenha
acesso a todos os itens do RecyclerView.
Antes de partirmos direto para o código de uma implementação de ItemKeyProvider é
importante saber que nossas chaves de seleção podem ser de algum dos três tipos a
seguir: Parcelable (ou subclasses); String; e Long.
Long e String certamente serão os tipos mais utilizados por serem mais comuns como
identificadores únicos de objetos. Mas caso o seu identificador único seja uma Uri, por
exemplo, que é uma subclasse de Parcelable, então utilize o tipo Parcelable.
Segue implementação de ItemKeyProvider:
Note que como "chave estável de seleção" foi utilizado o id do objeto Car, isso,
pois sabemos que ele se manterá o mesmo independente da mudança ou
reconstrução de objeto.
Há muitos exemplos da SelectionTracker onde a posição do item em lista é utilizada como
chave estável de acesso. Não recomendo isso, pois em caso de remoção de item, por
exemplo, as chaves de seleção de alguns itens são passíveis de serem alteradas, mesmo
com o objeto sendo o mesmo.
A implementação de ItemKeyProvider exige a codificação dos métodos getKey() e
getPosition() além da definição do escopo de acesso às chaves de seleção logo no
construtor de ItemKeyProvider. O parâmetro cars é somente parte da lógica de negócio
do exemplo.
São possíveis dois tipos de escopos:
• ItemKeyProvider.SCOPE_CACHED: fornece acesso a dados armazenados em
cache com base em itens que foram vinculados recentemente na exibição em tela.
Esse escopo permiti ao provedor um acesso mais eficiente aos dados, mas somente
àqueles em cache, tendo ainda mais limitações ante ao outro escopo;
• ItemKeyProvider.SCOPE_MAPPED: comumente utilizado, fornece acesso a todos os
dados, independentemente de estarem vinculados a uma exibição ou não. Permite
seleção de intervalo, quando utilizando o mouse, algo não suportado por
SCOPE_CACHED.
Em getKey() e em getPosition() é possível utilizar qualquer lógica de negócio, mas que
retorne, respectivamente: a chave estável de seleção do item e a posição do item de
acordo com a chave de seleção. Não há problemas se a posição mudar de acordo com a
saída ou entrada de novos itens, o importante é que a chave estável de um item (objeto) se
mantenha.
Implementando a ItemDetailsLookup
A classe abstrata ItemDetailsLookup permite que internamente a biblioteca
SelectionTracker acesse informações dos itens do RecyclerView alvo, itens que
receberam algum evento (toque, clique) que gera um objeto MotionEvent.
O parágrafo acima deve ter lhe deixado confuso, pois ele indica a função de
ItemDetailsLookup como sendo muito similar a função de ItemKeyProvider,
tirando somente a responsabilidade de gerencia das chaves estáveis de acesso.
Como acontece com ItemKeyProvider, ItemDetailsLookup é uma das classes
obrigatórias que permitem, aos códigos internos da biblioteca SelectionTracker,
acesso a informações dos itens do RecyclerView alvo.
A outra classe obrigatória que fecha a trinca, e que discutiremos na próxima seção,
é a ItemDetails.
Segue implementação de ItemDetailsLookup:
Note que a parametrização em ItemDetailsLookup tem de ser do mesmo tipo da
chave de seleção escolhida e já definida em ItemKeyProvider. Em nosso caso:
Long.
O algoritmo em getItemDetails() é o comumente utilizado para o fácil acesso ao
objeto ItemDetails vinculado ao item acionado pelo usuário.
Ainda chegaremos ao código do adapter CarsAdapter para mostrar como ficará a
propriedade itemDetails.
Implementando a ItemDetails
A classe abstrata ItemDetails fornece acesso às informações de um item
específico do RecyclerView, acesso interno a biblioteca SelectionTracker.
Em resumo: a implementação de ItemDetails é o último ponto que permite a
biblioteca SelectionTracker acesso aos itens do RecyclerView.
Segue implementação de ItemDetails:
Como obrigatório, somente as implementações de getPosition() e
getSelectionKey(). Mas se não for fornecida a implementação de
inSelectionHotspot(), os itens não serão passíveis de seleção, pois por padrão o
retorno é false.
Dentro dos métodos sobrescritos anteriormente, pode vir qualquer lógica de
negócio, aqui colocamos a lógica que atende ao exemplo.
O construtor está com propriedades mutáveis que aceitam valores null e -1, pois
objetos ItemDetails são reaproveitados dentro de instâncias ViewHolder do
adapter do RecyclerView alvo. Essa é uma decisão de projeto, para não inflar a
memória com inúmeros novos objetos ItemDetails.
Atualização da classe adaptadora
A classe adaptadora precisa ter:
• Uma propriedade do tipo SelectionTracker para poder ser trabalhado os itens
selecionados ou não selecionados;
• Uma propriedade do tipo ItemDetails no ViewHolder, isso para ser possível
passar informações de item aos códigos da biblioteca de seleção.
Primeiro a adição da propriedade selectionTracker:
Agora a adição de Details, que implementa ItemDetails:
Assim o algoritmo de atualização de item, incluindo a UI, que é invocado a partir do
método onBindViewHolder():
Note que não há algoritmo pronto para a atualização da UI de qualquer item, isso é
feito na "unha" no método invocado pelo onBindViewHolder().
O método onBindViewHolder() é invocado para todos os itens em tela e também
quando algum deles é selecionado (ou deixa de ser selecionado) pelo usuário.
Importante: Devido ao vinculo de um objeto SelectionTracker ao RecyclerView, o
ouvidor de clique adicionado (OnClickListener) somente funcionará se houver dois
toques (cliques) rápidos no item, mas mesmo assim a biblioteca de seleção
também será ativada. De qualquer forma, não é comum um contexto onde é
possível trabalhar a seleção de itens e também alguma ação extra quando houver
o toque / clique em algum dos itens.
Iniciando o objeto de seleção
O que ainda falta é a inicialização do objeto SelectionTracker e o vinculo dele ao adapter
do RecyclerView alvo.
Aqui a inicialização ocorrerá em uma atividade, mas no projeto de exemplo no Blog será
utilizado um fragmento. Em ambos os casos, a inicialização do objeto de seleção deve
ocorrer depois que o RecyclerView já foi configurado junto ao adapter e ao
LayoutManager escolhido.
Segue:
A parametrização de SelectionTracker.Builder tem que ser do tipo da chave
estável definida em ItemKeyProvider.
Há três possíveis chamadas de estratégia de armazenamento de chave estável:
• StorageStrategy.createLongStorage() para chaves do tipo Long;
• StorageStrategy.createStringStorage() para chaves do tipo String;
• StorageStrategy.createParcelableStorage( Class::class.java ) para chaves
do tipo Parcelable.
Assim já podemos realizar a execução do projeto:
Clique aqui para abrir a animação
Retendo os itens selecionados com o mesmo estado
Para que os itens se mantenham com o mesmo estado, selecionados ou não, em
caso de reconstrução de atividade ou fragmento, basta vincular o objeto
SelectionTracker ao onSaveInstanceState como a seguir:
Executando o projeto e rotacionando a tela, temos:
Clique aqui para abrir a animação
No caso do fragmento seriam necessárias as seguintes configurações:
No projeto de exemplo na segunda parte do artigo em Blog um objeto
SelectionTracker será utilizado junto a um fragmento, incluindo as configurações
necessárias para que o fragmento não seja sobrescrito por um novo na atividade host.
Definindo quais e quantos itens podem ser selecionados
Para a definição de quais e quantos itens podem ser selecionados, podemos utilizar uma
implementação de SelectionTracker.SelectionPredicate. A seguir a classe Predicate:
Quando realizando testes, o método canSetStateAtPosition() não é invocado em
nenhum momento.
Agora a inserção de uma instância de Predicate na configuração de
selectionTracker:
Executando o projeto e tentando mais de uma seleção ou então tentando a seleção
no item de ID 54 (Cargo, FIAT), temos:
Clique aqui para abrir a animação
Ouvidor de mudança de estado de item
É possível colocar um Observer junto a instância de SelectionTracker para ouvir
às mudanças de estado dos itens:
A parametrização de SelectionObserver deve ser do tipo da chave estável
definido em ItemKeyProvider.
Obtendo itens selecionados, selecionando e
removendo seleção
Em código dinâmico é possível obter os itens selecionados:
Na verdade as chaves estáveis dos itens selecionados é que serão retornadas.
É possível selecionar e remover seleção de itens pelas chaves estáveis deles:
Uma outra maneira de remover todas as seleções é com o método:
Os métodos select() e deselect() de SelectionTracker também permitem a
seleção e remoção de seleção.
Pontos negativos
• Realmente toda a exigência de classes em heranças poderia ser reduzida em
métodos de um único SelectionTracker.Builder;
• O método canSetStateAtPosition() de SelectionPredicate, até momento da
construção deste artigo, não estava funcional;
• Não há um método de remoção do objeto SelectionTracker junto ao
RecyclerView alvo, algo que complica o trabalho com o SelectionTracker em
delay, quando ele não é vinculado ao RecyclerView logo na configuração
deste framework de lista;
• A adição ou remoção de itens ao RecyclerView pode causar uma Exception
caso o notifyDataSetChanged() não seja invocado logo depois da adição ou
remoção e do clearSelection(). Isso, pois internamente na SelectionTracker
a atualização de chaves e posições está ocorrendo somente depois do
notifyDataSetChanged() ser invocado, algo não informado em
documentação.
Pontos positivos
• A configuração para manter o estado dos itens, selecionados ou não, é muito
simples;
• A biblioteca permite que sejam definidas "n" maneiras de seleção de item e
não somente por meio do toque ou clique;
• É simples limitar quais itens podem ou não ser selecionados, incluindo a
limitação da quantidade de itens.
Considerações finais
Obviamente que existem inúmeros algoritmos e APIs de terceiros que permitem a
fácil seleção de itens em RecyclerView, mas com a biblioteca SelectionTracker,
mesmo que não de maneira simples, temos muitas opções somente para a seleção
de itens em RecyclerView, algo que a deixa como uma API completa.
Este é o primeiro ano da biblioteca, ainda há muitos problemas, principalmente de
interface pública.
Algumas classes podem ser removidas no cenário de "necessidade de
implementação", a ItemDetails é uma delas, pode se tornar mais um método em
SelectionTracker.Builder.
A API já é passível de ser utilizada em produção, segundo os testes que realizei. E
agora é aguardar a evolução dela.
Há outras possibilidades com a SelectionTracker, possibilidades que serão
abordadas em futuros artigos do Blog.
Fontes
Conteúdo completo, em texto e em vídeo, no link a seguir:
• SelectionTracker Para Seleção de Itens no RecyclerView Android.
Fontes:
• Create a List with RecyclerView;
• Documentação oficial ItemDetailsLookup;
• Documentação oficial ItemDetailsLookup.ItemDetails;
• Documentação oficial ItemKeyProvider;
• Documentação oficial SelectionTracker.Builder;
• Documentação oficial StableIdKeyProvider;
• Documentação oficial SelectionPredicate;
• Android recycler view with multiple item selections;
• Kotlin - Classes and Inheritance;
• Add selection support to RecyclerView Selection;
• Android - what is the meaning of StableIDs? - Resposta de Delyan.
Para estudo
• Treinamento oficial:
• Prototipagem Profissional de Aplicativos Android.
• Meus livros:
• Desenvolvedor Kotlin Android - Bibliotecas para o dia a dia;
• Receitas Para Desenvolvedores Android;
• Refatorando Para Programas Limpos.
• Redes:
• Udemy;
• YouTube;
• Facebook;
• LinkedIn;
• GitHub;
• Twitter;
• Google Plus.
• Blog App.
SelectionTracker Para Seleção de
Itens no RecyclerView Android
thiengo.com.br
Vinícius Thiengo
thiengocalopsita@gmail.com

Mais conteúdo relacionado

Mais procurados

Estudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogEstudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do Blog
Vinícius Thiengo
 
Observable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI AndroidObservable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI Android
Vinícius Thiengo
 
PhotoView Android Para a Completa Implementação de Zoom
PhotoView Android Para a Completa Implementação de ZoomPhotoView Android Para a Completa Implementação de Zoom
PhotoView Android Para a Completa Implementação de Zoom
Vinícius Thiengo
 
Chips Android, Quando e Como Utilizar
Chips Android, Quando e Como UtilizarChips Android, Quando e Como Utilizar
Chips Android, Quando e Como Utilizar
Vinícius Thiengo
 
Estudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogEstudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do Blog
Vinícius Thiengo
 
Leitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXingLeitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXing
Vinícius Thiengo
 
BottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando UtilizarBottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando Utilizar
Vinícius Thiengo
 
Android Studio
Android StudioAndroid Studio
Android Studio
Vinícius Thiengo
 
Trabalhando Análise Qualitativa em seu Aplicativo Android
Trabalhando Análise Qualitativa em seu Aplicativo AndroidTrabalhando Análise Qualitativa em seu Aplicativo Android
Trabalhando Análise Qualitativa em seu Aplicativo Android
Vinícius Thiengo
 
Como Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State APIComo Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State API
Vinícius Thiengo
 
Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?
Vinícius Thiengo
 
Annotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no AndroidAnnotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no Android
Vinícius Thiengo
 
Fontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e UsoFontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e Uso
Vinícius Thiengo
 
Tutorial - Como criar sua primeira app para Android
Tutorial - Como criar sua primeira app para AndroidTutorial - Como criar sua primeira app para Android
Tutorial - Como criar sua primeira app para Android
Sidney Roberto
 
Android Aula 5
Android Aula 5Android Aula 5
Android Aula 5
Erisvaldo Junior
 
Introdução ao desenvolvimento de apps para Android - Dia 2/2
Introdução ao desenvolvimento de apps para Android - Dia 2/2Introdução ao desenvolvimento de apps para Android - Dia 2/2
Introdução ao desenvolvimento de apps para Android - Dia 2/2
Matheus Calegaro
 
True Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no AndroidTrue Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no Android
Vinícius Thiengo
 
Programação Android - Básico
Programação Android - BásicoProgramação Android - Básico
Programação Android - Básico
HugoDalevedove
 
Introdução ao Desenvolvimento Android
Introdução ao Desenvolvimento AndroidIntrodução ao Desenvolvimento Android
Introdução ao Desenvolvimento Android
José Alexandre Macedo
 
Android Aula 4
Android Aula 4Android Aula 4
Android Aula 4
Erisvaldo Junior
 

Mais procurados (20)

Estudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogEstudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do Blog
 
Observable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI AndroidObservable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI Android
 
PhotoView Android Para a Completa Implementação de Zoom
PhotoView Android Para a Completa Implementação de ZoomPhotoView Android Para a Completa Implementação de Zoom
PhotoView Android Para a Completa Implementação de Zoom
 
Chips Android, Quando e Como Utilizar
Chips Android, Quando e Como UtilizarChips Android, Quando e Como Utilizar
Chips Android, Quando e Como Utilizar
 
Estudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogEstudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do Blog
 
Leitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXingLeitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXing
 
BottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando UtilizarBottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando Utilizar
 
Android Studio
Android StudioAndroid Studio
Android Studio
 
Trabalhando Análise Qualitativa em seu Aplicativo Android
Trabalhando Análise Qualitativa em seu Aplicativo AndroidTrabalhando Análise Qualitativa em seu Aplicativo Android
Trabalhando Análise Qualitativa em seu Aplicativo Android
 
Como Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State APIComo Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State API
 
Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?
 
Annotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no AndroidAnnotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no Android
 
Fontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e UsoFontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e Uso
 
Tutorial - Como criar sua primeira app para Android
Tutorial - Como criar sua primeira app para AndroidTutorial - Como criar sua primeira app para Android
Tutorial - Como criar sua primeira app para Android
 
Android Aula 5
Android Aula 5Android Aula 5
Android Aula 5
 
Introdução ao desenvolvimento de apps para Android - Dia 2/2
Introdução ao desenvolvimento de apps para Android - Dia 2/2Introdução ao desenvolvimento de apps para Android - Dia 2/2
Introdução ao desenvolvimento de apps para Android - Dia 2/2
 
True Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no AndroidTrue Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no Android
 
Programação Android - Básico
Programação Android - BásicoProgramação Android - Básico
Programação Android - Básico
 
Introdução ao Desenvolvimento Android
Introdução ao Desenvolvimento AndroidIntrodução ao Desenvolvimento Android
Introdução ao Desenvolvimento Android
 
Android Aula 4
Android Aula 4Android Aula 4
Android Aula 4
 

Semelhante a SelectionTracker Para Seleção de Itens no RecyclerView Android

Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)
Ryan Padilha
 
Desenvolvimento de Apps e Games para Android - Parte 6
Desenvolvimento de Apps e Games para Android - Parte 6Desenvolvimento de Apps e Games para Android - Parte 6
Desenvolvimento de Apps e Games para Android - Parte 6
Erisvaldo Junior
 
React js
React js React js
React js
Alexandre Rosa
 
[CLPE] Novidades do Asp.net mvc 2
[CLPE] Novidades do Asp.net mvc 2[CLPE] Novidades do Asp.net mvc 2
[CLPE] Novidades do Asp.net mvc 2
Felipe Pimentel
 
Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5
Erisvaldo Junior
 
Curso de ReactJS
Curso de ReactJSCurso de ReactJS
Curso de ReactJS
Gustavo Lopes
 
Orientação a Objetos no Delphi - Controle de Estoque (III)
Orientação a Objetos no Delphi - Controle de Estoque (III)Orientação a Objetos no Delphi - Controle de Estoque (III)
Orientação a Objetos no Delphi - Controle de Estoque (III)
Ryan Padilha
 
React JS - Parte 2
React JS - Parte 2React JS - Parte 2
React JS - Parte 2
Bruno Catão
 
Introdução à programação para Android
Introdução à programação para AndroidIntrodução à programação para Android
Introdução à programação para Android
Jorge Cardoso
 
programacao-c-banco-de-dados
programacao-c-banco-de-dadosprogramacao-c-banco-de-dados
programacao-c-banco-de-dados
Raul Dias
 
Java7
Java7Java7
Conhecendo o Spring
Conhecendo o SpringConhecendo o Spring
Conhecendo o Spring
Maurício Linhares
 
hibernate annotation
hibernate annotationhibernate annotation
hibernate annotation
eduardo dias
 
Aula1
Aula1Aula1
Aula1
mentrixmax
 
Curso de Ruby on Rails - Aula 02
Curso de Ruby on Rails - Aula 02Curso de Ruby on Rails - Aula 02
Curso de Ruby on Rails - Aula 02
Maurício Linhares
 
ASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre TarifaASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre Tarifa
guestea329c
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
Alexandre Tarifa
 
Ado.net.exmplos.praticos
Ado.net.exmplos.praticosAdo.net.exmplos.praticos
Ado.net.exmplos.praticos
Hélder Oliveira
 
Apostila_JavaScript_pela_axademia_ardkgfv
Apostila_JavaScript_pela_axademia_ardkgfvApostila_JavaScript_pela_axademia_ardkgfv
Apostila_JavaScript_pela_axademia_ardkgfv
erickrodrigo23
 
Framework struts2v2.5
Framework struts2v2.5Framework struts2v2.5
Framework struts2v2.5
Eduardo Gabina
 

Semelhante a SelectionTracker Para Seleção de Itens no RecyclerView Android (20)

Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)
 
Desenvolvimento de Apps e Games para Android - Parte 6
Desenvolvimento de Apps e Games para Android - Parte 6Desenvolvimento de Apps e Games para Android - Parte 6
Desenvolvimento de Apps e Games para Android - Parte 6
 
React js
React js React js
React js
 
[CLPE] Novidades do Asp.net mvc 2
[CLPE] Novidades do Asp.net mvc 2[CLPE] Novidades do Asp.net mvc 2
[CLPE] Novidades do Asp.net mvc 2
 
Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5
 
Curso de ReactJS
Curso de ReactJSCurso de ReactJS
Curso de ReactJS
 
Orientação a Objetos no Delphi - Controle de Estoque (III)
Orientação a Objetos no Delphi - Controle de Estoque (III)Orientação a Objetos no Delphi - Controle de Estoque (III)
Orientação a Objetos no Delphi - Controle de Estoque (III)
 
React JS - Parte 2
React JS - Parte 2React JS - Parte 2
React JS - Parte 2
 
Introdução à programação para Android
Introdução à programação para AndroidIntrodução à programação para Android
Introdução à programação para Android
 
programacao-c-banco-de-dados
programacao-c-banco-de-dadosprogramacao-c-banco-de-dados
programacao-c-banco-de-dados
 
Java7
Java7Java7
Java7
 
Conhecendo o Spring
Conhecendo o SpringConhecendo o Spring
Conhecendo o Spring
 
hibernate annotation
hibernate annotationhibernate annotation
hibernate annotation
 
Aula1
Aula1Aula1
Aula1
 
Curso de Ruby on Rails - Aula 02
Curso de Ruby on Rails - Aula 02Curso de Ruby on Rails - Aula 02
Curso de Ruby on Rails - Aula 02
 
ASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre TarifaASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre Tarifa
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Ado.net.exmplos.praticos
Ado.net.exmplos.praticosAdo.net.exmplos.praticos
Ado.net.exmplos.praticos
 
Apostila_JavaScript_pela_axademia_ardkgfv
Apostila_JavaScript_pela_axademia_ardkgfvApostila_JavaScript_pela_axademia_ardkgfv
Apostila_JavaScript_pela_axademia_ardkgfv
 
Framework struts2v2.5
Framework struts2v2.5Framework struts2v2.5
Framework struts2v2.5
 

Mais de Vinícius Thiengo

7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
Vinícius Thiengo
 
5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria ler5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria ler
Vinícius Thiengo
 
Utilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no AndroidUtilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no Android
Vinícius Thiengo
 
Android: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda CulturalAndroid: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda Cultural
Vinícius Thiengo
 
Freelancer Android
Freelancer AndroidFreelancer Android
Freelancer Android
Vinícius Thiengo
 
Definindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos AndroidDefinindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos Android
Vinícius Thiengo
 
Material Design
Material DesignMaterial Design
Material Design
Vinícius Thiengo
 

Mais de Vinícius Thiengo (7)

7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
 
5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria ler5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria ler
 
Utilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no AndroidUtilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no Android
 
Android: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda CulturalAndroid: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda Cultural
 
Freelancer Android
Freelancer AndroidFreelancer Android
Freelancer Android
 
Definindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos AndroidDefinindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos Android
 
Material Design
Material DesignMaterial Design
Material Design
 

Último

O que é o programa nacional de alimentação escolar (PNAE)?
O que é  o programa nacional de alimentação escolar (PNAE)?O que é  o programa nacional de alimentação escolar (PNAE)?
O que é o programa nacional de alimentação escolar (PNAE)?
Marcelo Botura
 
Introdução ao filme Divertida Mente 2 em pdf
Introdução ao filme Divertida Mente 2 em pdfIntrodução ao filme Divertida Mente 2 em pdf
Introdução ao filme Divertida Mente 2 em pdf
valdeci17
 
28 - Agente de Endemias (40 mapas mentais) - Amostra.pdf
28 - Agente de Endemias (40 mapas mentais) - Amostra.pdf28 - Agente de Endemias (40 mapas mentais) - Amostra.pdf
28 - Agente de Endemias (40 mapas mentais) - Amostra.pdf
SheylaAlves6
 
Intendência da Aeronáutica. Somos um, sou você Intendência!.pdf
Intendência da Aeronáutica. Somos um, sou você Intendência!.pdfIntendência da Aeronáutica. Somos um, sou você Intendência!.pdf
Intendência da Aeronáutica. Somos um, sou você Intendência!.pdf
Falcão Brasil
 
Boletim informativo - Contacto - julho de 2024
Boletim informativo - Contacto - julho de 2024Boletim informativo - Contacto - julho de 2024
Boletim informativo - Contacto - julho de 2024
Bibliotecas Escolares AEIDH
 
Geotecnologias Aplicadas na Gestão de Riscos e Desastres Hidrológicos.pdf
Geotecnologias Aplicadas na Gestão de Riscos e Desastres Hidrológicos.pdfGeotecnologias Aplicadas na Gestão de Riscos e Desastres Hidrológicos.pdf
Geotecnologias Aplicadas na Gestão de Riscos e Desastres Hidrológicos.pdf
Falcão Brasil
 
A Atuação das Forças Armadas na Garantia da Lei e da Ordem (GLO).pdf
A Atuação das Forças Armadas na Garantia da Lei e da Ordem (GLO).pdfA Atuação das Forças Armadas na Garantia da Lei e da Ordem (GLO).pdf
A Atuação das Forças Armadas na Garantia da Lei e da Ordem (GLO).pdf
Falcão Brasil
 
gestão_de_conflitos_no_ambiente_escolar.pdf
gestão_de_conflitos_no_ambiente_escolar.pdfgestão_de_conflitos_no_ambiente_escolar.pdf
gestão_de_conflitos_no_ambiente_escolar.pdf
Maria das Graças Machado Rodrigues
 
A Guerra do Presente - Ministério da Defesa.pdf
A Guerra do Presente - Ministério da Defesa.pdfA Guerra do Presente - Ministério da Defesa.pdf
A Guerra do Presente - Ministério da Defesa.pdf
Falcão Brasil
 
Guia Genealógico da Principesca e Ducal Casa de Mesolcina, 2024
Guia Genealógico da Principesca e Ducal Casa de Mesolcina, 2024Guia Genealógico da Principesca e Ducal Casa de Mesolcina, 2024
Guia Genealógico da Principesca e Ducal Casa de Mesolcina, 2024
principeandregalli
 
Organograma do Centro Gestor e Operacional do Sistema de Proteção da Amazônia...
Organograma do Centro Gestor e Operacional do Sistema de Proteção da Amazônia...Organograma do Centro Gestor e Operacional do Sistema de Proteção da Amazônia...
Organograma do Centro Gestor e Operacional do Sistema de Proteção da Amazônia...
Falcão Brasil
 
UFCD_7224_Prevenção de acidentes em contexto domiciliário e institucional_índ...
UFCD_7224_Prevenção de acidentes em contexto domiciliário e institucional_índ...UFCD_7224_Prevenção de acidentes em contexto domiciliário e institucional_índ...
UFCD_7224_Prevenção de acidentes em contexto domiciliário e institucional_índ...
Manuais Formação
 
Slides Lição 3, Betel, A relevância da Igreja no cumprimento de sua Missão.pptx
Slides Lição 3, Betel, A relevância da Igreja no cumprimento de sua Missão.pptxSlides Lição 3, Betel, A relevância da Igreja no cumprimento de sua Missão.pptx
Slides Lição 3, Betel, A relevância da Igreja no cumprimento de sua Missão.pptx
LuizHenriquedeAlmeid6
 
Caça-palavras - multiplicação
Caça-palavras  -  multiplicaçãoCaça-palavras  -  multiplicação
Caça-palavras - multiplicação
Mary Alvarenga
 
17 Coisas que seus alunos deveriam saber sobre TRI para melhorar sua nota no ...
17 Coisas que seus alunos deveriam saber sobre TRI para melhorar sua nota no ...17 Coisas que seus alunos deveriam saber sobre TRI para melhorar sua nota no ...
17 Coisas que seus alunos deveriam saber sobre TRI para melhorar sua nota no ...
Estuda.com
 
A Industria Brasileira de Defesa - Situação Atual e Perspectivas de Evolução.pdf
A Industria Brasileira de Defesa - Situação Atual e Perspectivas de Evolução.pdfA Industria Brasileira de Defesa - Situação Atual e Perspectivas de Evolução.pdf
A Industria Brasileira de Defesa - Situação Atual e Perspectivas de Evolução.pdf
Falcão Brasil
 
Oceano, Fonte de Vida e Beleza Maria Inês Aroeira Braga.ppsx
Oceano, Fonte de Vida e Beleza Maria Inês Aroeira Braga.ppsxOceano, Fonte de Vida e Beleza Maria Inês Aroeira Braga.ppsx
Oceano, Fonte de Vida e Beleza Maria Inês Aroeira Braga.ppsx
Luzia Gabriele
 
Administração Em Enfermagem.pptx caala - Cópia-1.pptx
Administração Em Enfermagem.pptx caala - Cópia-1.pptxAdministração Em Enfermagem.pptx caala - Cópia-1.pptx
Administração Em Enfermagem.pptx caala - Cópia-1.pptx
helenawaya9
 
P0107 do aluno da educação municipal.pdf
P0107 do aluno da educação municipal.pdfP0107 do aluno da educação municipal.pdf
P0107 do aluno da educação municipal.pdf
Ceiça Martins Vital
 
Fotossíntese e respiração: conceitos e trocas gasosas
Fotossíntese e respiração: conceitos e trocas gasosasFotossíntese e respiração: conceitos e trocas gasosas
Fotossíntese e respiração: conceitos e trocas gasosas
MariaJooSilva58
 

Último (20)

O que é o programa nacional de alimentação escolar (PNAE)?
O que é  o programa nacional de alimentação escolar (PNAE)?O que é  o programa nacional de alimentação escolar (PNAE)?
O que é o programa nacional de alimentação escolar (PNAE)?
 
Introdução ao filme Divertida Mente 2 em pdf
Introdução ao filme Divertida Mente 2 em pdfIntrodução ao filme Divertida Mente 2 em pdf
Introdução ao filme Divertida Mente 2 em pdf
 
28 - Agente de Endemias (40 mapas mentais) - Amostra.pdf
28 - Agente de Endemias (40 mapas mentais) - Amostra.pdf28 - Agente de Endemias (40 mapas mentais) - Amostra.pdf
28 - Agente de Endemias (40 mapas mentais) - Amostra.pdf
 
Intendência da Aeronáutica. Somos um, sou você Intendência!.pdf
Intendência da Aeronáutica. Somos um, sou você Intendência!.pdfIntendência da Aeronáutica. Somos um, sou você Intendência!.pdf
Intendência da Aeronáutica. Somos um, sou você Intendência!.pdf
 
Boletim informativo - Contacto - julho de 2024
Boletim informativo - Contacto - julho de 2024Boletim informativo - Contacto - julho de 2024
Boletim informativo - Contacto - julho de 2024
 
Geotecnologias Aplicadas na Gestão de Riscos e Desastres Hidrológicos.pdf
Geotecnologias Aplicadas na Gestão de Riscos e Desastres Hidrológicos.pdfGeotecnologias Aplicadas na Gestão de Riscos e Desastres Hidrológicos.pdf
Geotecnologias Aplicadas na Gestão de Riscos e Desastres Hidrológicos.pdf
 
A Atuação das Forças Armadas na Garantia da Lei e da Ordem (GLO).pdf
A Atuação das Forças Armadas na Garantia da Lei e da Ordem (GLO).pdfA Atuação das Forças Armadas na Garantia da Lei e da Ordem (GLO).pdf
A Atuação das Forças Armadas na Garantia da Lei e da Ordem (GLO).pdf
 
gestão_de_conflitos_no_ambiente_escolar.pdf
gestão_de_conflitos_no_ambiente_escolar.pdfgestão_de_conflitos_no_ambiente_escolar.pdf
gestão_de_conflitos_no_ambiente_escolar.pdf
 
A Guerra do Presente - Ministério da Defesa.pdf
A Guerra do Presente - Ministério da Defesa.pdfA Guerra do Presente - Ministério da Defesa.pdf
A Guerra do Presente - Ministério da Defesa.pdf
 
Guia Genealógico da Principesca e Ducal Casa de Mesolcina, 2024
Guia Genealógico da Principesca e Ducal Casa de Mesolcina, 2024Guia Genealógico da Principesca e Ducal Casa de Mesolcina, 2024
Guia Genealógico da Principesca e Ducal Casa de Mesolcina, 2024
 
Organograma do Centro Gestor e Operacional do Sistema de Proteção da Amazônia...
Organograma do Centro Gestor e Operacional do Sistema de Proteção da Amazônia...Organograma do Centro Gestor e Operacional do Sistema de Proteção da Amazônia...
Organograma do Centro Gestor e Operacional do Sistema de Proteção da Amazônia...
 
UFCD_7224_Prevenção de acidentes em contexto domiciliário e institucional_índ...
UFCD_7224_Prevenção de acidentes em contexto domiciliário e institucional_índ...UFCD_7224_Prevenção de acidentes em contexto domiciliário e institucional_índ...
UFCD_7224_Prevenção de acidentes em contexto domiciliário e institucional_índ...
 
Slides Lição 3, Betel, A relevância da Igreja no cumprimento de sua Missão.pptx
Slides Lição 3, Betel, A relevância da Igreja no cumprimento de sua Missão.pptxSlides Lição 3, Betel, A relevância da Igreja no cumprimento de sua Missão.pptx
Slides Lição 3, Betel, A relevância da Igreja no cumprimento de sua Missão.pptx
 
Caça-palavras - multiplicação
Caça-palavras  -  multiplicaçãoCaça-palavras  -  multiplicação
Caça-palavras - multiplicação
 
17 Coisas que seus alunos deveriam saber sobre TRI para melhorar sua nota no ...
17 Coisas que seus alunos deveriam saber sobre TRI para melhorar sua nota no ...17 Coisas que seus alunos deveriam saber sobre TRI para melhorar sua nota no ...
17 Coisas que seus alunos deveriam saber sobre TRI para melhorar sua nota no ...
 
A Industria Brasileira de Defesa - Situação Atual e Perspectivas de Evolução.pdf
A Industria Brasileira de Defesa - Situação Atual e Perspectivas de Evolução.pdfA Industria Brasileira de Defesa - Situação Atual e Perspectivas de Evolução.pdf
A Industria Brasileira de Defesa - Situação Atual e Perspectivas de Evolução.pdf
 
Oceano, Fonte de Vida e Beleza Maria Inês Aroeira Braga.ppsx
Oceano, Fonte de Vida e Beleza Maria Inês Aroeira Braga.ppsxOceano, Fonte de Vida e Beleza Maria Inês Aroeira Braga.ppsx
Oceano, Fonte de Vida e Beleza Maria Inês Aroeira Braga.ppsx
 
Administração Em Enfermagem.pptx caala - Cópia-1.pptx
Administração Em Enfermagem.pptx caala - Cópia-1.pptxAdministração Em Enfermagem.pptx caala - Cópia-1.pptx
Administração Em Enfermagem.pptx caala - Cópia-1.pptx
 
P0107 do aluno da educação municipal.pdf
P0107 do aluno da educação municipal.pdfP0107 do aluno da educação municipal.pdf
P0107 do aluno da educação municipal.pdf
 
Fotossíntese e respiração: conceitos e trocas gasosas
Fotossíntese e respiração: conceitos e trocas gasosasFotossíntese e respiração: conceitos e trocas gasosas
Fotossíntese e respiração: conceitos e trocas gasosas
 

SelectionTracker Para Seleção de Itens no RecyclerView Android

  • 1. SelectionTracker Para Seleção de Itens no RecyclerView Android thiengo.com.br
  • 2. Qual o objetivo da biblioteca SelectionTracker? Primeiro é importante lembrar que o RecyclerView, ao menos quando nos primeiros contatos, não é nada trivial como um ListView ou um GridView. Partindo desse ponto já temos que colocar um algoritmo de marcação de itens, único ou múltiplos, se torna algo ainda menos simples. O time do Google Android liberou a biblioteca SelectionTracker com o objetivo de facilitar a inclusão da funcionalidade de seleção de itens no RecyclerView. A biblioteca foi liberada em 2018 junto ao sucessor da Support Library, o AndroidX. Com a SelectionTracker é também possível: • Escolher como os itens podem ser selecionados: • Toque / clique; • Gesto específico; • Drag. • Definir quais e quantos itens podem ser selecionados; • Ter fácil acesso aos itens selecionados. Mas, como desenvolvedor Android que somos, sabemos que nem tudo "são flores”. Caso você precise de algo muito simples, a marcação de um único item em lista, por exemplo, você provavelmente achará o número de classes necessárias, para a configuração de um objeto SelectionTracker, uma escolha em demasiado.
  • 3. Conhecer o RecyclerView é necessário Antes de continuar, caso você ainda não conheça o RecyclerView, a seguir deixo dois links do Blog onde somente falo sobre este framework de lista, que por sinal é o melhor framework de lista disponível no Android: • RecyclerView, Material Design Android - Parte 2; • Animação, onLongPress e GridLayoutManager em RecyclerView, Material Design Android - Parte 3. Apesar de os conteúdos indicados serem parte de uma Play List, eles são passíveis de serem compreendidos sem que o vídeo 1 da Play List, sobre o Toolbar, seja assistido.
  • 4. O vinculo da SelectionTracker A biblioteca SelectionTracker vem em um diferente pacote do que contém o RecyclerView. Há também um "melhor roteiro" para adicionarmos a biblioteca a algum projeto. O roteiro de vinculação da SelectionTracker, indicado pela documentação oficial, é como a seguir: • Primeiro desenvolva a configuração de lista do projeto, utilizando RecyclerView, lista de dados e adapter; • Logo após adicione a referência da SelectionTracker no Gradle Nível de Aplicativo; • Então implemente uma versão da classe abstrata ItemKeyProvider; • Depois implemente uma versão da classe abstrata ItemDetailsLookup; • Assim implemente uma versão da ItemDetails, outra classe abstrata; • Implemente também uma SelectionPredicate; • Atualize o código do adapter do RecyclerView para conter um objeto SelectionTracker e também o algoritmo de mudança de UI dos itens selecionados / não selecionados; • Inicialize um objeto SelectionTracker e vincule ele ao RecyclerView alvo. Para lhe animar: apesar da extensa lista acima para uma única funcionalidade, a maioria dos códigos são boilerplate, somente têm de estar no projeto, não exigindo esforço de lógica. O primeiro tópico da lista acima é implementado no projeto de exemplo na segunda parte do artigo no Blog. Aqui nos slides vamos direto ao estudo da biblioteca SelectionTracker.
  • 5. Classe de exemplo Antes de partirmos para os códigos oficiais da SelectionTracker, vamos a uma simples classe de domínio que utilizaremos como referência. Segue classe Car:
  • 6. Instalação da biblioteca A SelectionTracker foi adicionada ao Android junto ao pacote AndroidX, mas nós também temos uma versão dela na Support Library, que é exatamente a que utilizaremos aqui enquanto ainda não temos um conteúdo no Blog sobre a AndroidX. No Gradle Nível de Aplicativo, build.gradle (Module: app), adicione: Na época da construção deste conteúdo a versão estável mais atual era a 28.0.0.
  • 7. Implementando a ItemKeyProvider A classe abstrata ItemKeyProvider é a entidade que fornece acesso as chaves estáveis dos itens, acesso interno à biblioteca SelectionTracker. Resumidamente: uma "chave estável" é um identificador que se mantém o mesmo independente da mudança de posição ou mudança de propriedade de um objeto. Um exemplo simples de chave estável é o ID de um usuário em banco de dados. Podemos mudar alguns atributos do usuário, como a idade dele, mas o ID se manterá o mesmo. Essas chaves de acesso, que são possíveis via implementação de uma ItemKeyProvider, são o primeiro ponto que permite que internamente a biblioteca SelectionTracker tenha acesso a todos os itens do RecyclerView. Antes de partirmos direto para o código de uma implementação de ItemKeyProvider é importante saber que nossas chaves de seleção podem ser de algum dos três tipos a seguir: Parcelable (ou subclasses); String; e Long. Long e String certamente serão os tipos mais utilizados por serem mais comuns como identificadores únicos de objetos. Mas caso o seu identificador único seja uma Uri, por exemplo, que é uma subclasse de Parcelable, então utilize o tipo Parcelable.
  • 8. Segue implementação de ItemKeyProvider: Note que como "chave estável de seleção" foi utilizado o id do objeto Car, isso, pois sabemos que ele se manterá o mesmo independente da mudança ou reconstrução de objeto.
  • 9. Há muitos exemplos da SelectionTracker onde a posição do item em lista é utilizada como chave estável de acesso. Não recomendo isso, pois em caso de remoção de item, por exemplo, as chaves de seleção de alguns itens são passíveis de serem alteradas, mesmo com o objeto sendo o mesmo. A implementação de ItemKeyProvider exige a codificação dos métodos getKey() e getPosition() além da definição do escopo de acesso às chaves de seleção logo no construtor de ItemKeyProvider. O parâmetro cars é somente parte da lógica de negócio do exemplo. São possíveis dois tipos de escopos: • ItemKeyProvider.SCOPE_CACHED: fornece acesso a dados armazenados em cache com base em itens que foram vinculados recentemente na exibição em tela. Esse escopo permiti ao provedor um acesso mais eficiente aos dados, mas somente àqueles em cache, tendo ainda mais limitações ante ao outro escopo; • ItemKeyProvider.SCOPE_MAPPED: comumente utilizado, fornece acesso a todos os dados, independentemente de estarem vinculados a uma exibição ou não. Permite seleção de intervalo, quando utilizando o mouse, algo não suportado por SCOPE_CACHED. Em getKey() e em getPosition() é possível utilizar qualquer lógica de negócio, mas que retorne, respectivamente: a chave estável de seleção do item e a posição do item de acordo com a chave de seleção. Não há problemas se a posição mudar de acordo com a saída ou entrada de novos itens, o importante é que a chave estável de um item (objeto) se mantenha.
  • 10. Implementando a ItemDetailsLookup A classe abstrata ItemDetailsLookup permite que internamente a biblioteca SelectionTracker acesse informações dos itens do RecyclerView alvo, itens que receberam algum evento (toque, clique) que gera um objeto MotionEvent. O parágrafo acima deve ter lhe deixado confuso, pois ele indica a função de ItemDetailsLookup como sendo muito similar a função de ItemKeyProvider, tirando somente a responsabilidade de gerencia das chaves estáveis de acesso. Como acontece com ItemKeyProvider, ItemDetailsLookup é uma das classes obrigatórias que permitem, aos códigos internos da biblioteca SelectionTracker, acesso a informações dos itens do RecyclerView alvo. A outra classe obrigatória que fecha a trinca, e que discutiremos na próxima seção, é a ItemDetails.
  • 11. Segue implementação de ItemDetailsLookup:
  • 12. Note que a parametrização em ItemDetailsLookup tem de ser do mesmo tipo da chave de seleção escolhida e já definida em ItemKeyProvider. Em nosso caso: Long. O algoritmo em getItemDetails() é o comumente utilizado para o fácil acesso ao objeto ItemDetails vinculado ao item acionado pelo usuário. Ainda chegaremos ao código do adapter CarsAdapter para mostrar como ficará a propriedade itemDetails.
  • 13. Implementando a ItemDetails A classe abstrata ItemDetails fornece acesso às informações de um item específico do RecyclerView, acesso interno a biblioteca SelectionTracker. Em resumo: a implementação de ItemDetails é o último ponto que permite a biblioteca SelectionTracker acesso aos itens do RecyclerView.
  • 14. Segue implementação de ItemDetails:
  • 15. Como obrigatório, somente as implementações de getPosition() e getSelectionKey(). Mas se não for fornecida a implementação de inSelectionHotspot(), os itens não serão passíveis de seleção, pois por padrão o retorno é false. Dentro dos métodos sobrescritos anteriormente, pode vir qualquer lógica de negócio, aqui colocamos a lógica que atende ao exemplo. O construtor está com propriedades mutáveis que aceitam valores null e -1, pois objetos ItemDetails são reaproveitados dentro de instâncias ViewHolder do adapter do RecyclerView alvo. Essa é uma decisão de projeto, para não inflar a memória com inúmeros novos objetos ItemDetails.
  • 16. Atualização da classe adaptadora A classe adaptadora precisa ter: • Uma propriedade do tipo SelectionTracker para poder ser trabalhado os itens selecionados ou não selecionados; • Uma propriedade do tipo ItemDetails no ViewHolder, isso para ser possível passar informações de item aos códigos da biblioteca de seleção. Primeiro a adição da propriedade selectionTracker:
  • 17. Agora a adição de Details, que implementa ItemDetails:
  • 18. Assim o algoritmo de atualização de item, incluindo a UI, que é invocado a partir do método onBindViewHolder():
  • 19. Note que não há algoritmo pronto para a atualização da UI de qualquer item, isso é feito na "unha" no método invocado pelo onBindViewHolder(). O método onBindViewHolder() é invocado para todos os itens em tela e também quando algum deles é selecionado (ou deixa de ser selecionado) pelo usuário. Importante: Devido ao vinculo de um objeto SelectionTracker ao RecyclerView, o ouvidor de clique adicionado (OnClickListener) somente funcionará se houver dois toques (cliques) rápidos no item, mas mesmo assim a biblioteca de seleção também será ativada. De qualquer forma, não é comum um contexto onde é possível trabalhar a seleção de itens e também alguma ação extra quando houver o toque / clique em algum dos itens.
  • 20. Iniciando o objeto de seleção O que ainda falta é a inicialização do objeto SelectionTracker e o vinculo dele ao adapter do RecyclerView alvo. Aqui a inicialização ocorrerá em uma atividade, mas no projeto de exemplo no Blog será utilizado um fragmento. Em ambos os casos, a inicialização do objeto de seleção deve ocorrer depois que o RecyclerView já foi configurado junto ao adapter e ao LayoutManager escolhido. Segue:
  • 21. A parametrização de SelectionTracker.Builder tem que ser do tipo da chave estável definida em ItemKeyProvider. Há três possíveis chamadas de estratégia de armazenamento de chave estável: • StorageStrategy.createLongStorage() para chaves do tipo Long; • StorageStrategy.createStringStorage() para chaves do tipo String; • StorageStrategy.createParcelableStorage( Class::class.java ) para chaves do tipo Parcelable.
  • 22. Assim já podemos realizar a execução do projeto: Clique aqui para abrir a animação
  • 23. Retendo os itens selecionados com o mesmo estado Para que os itens se mantenham com o mesmo estado, selecionados ou não, em caso de reconstrução de atividade ou fragmento, basta vincular o objeto SelectionTracker ao onSaveInstanceState como a seguir:
  • 24. Executando o projeto e rotacionando a tela, temos: Clique aqui para abrir a animação
  • 25. No caso do fragmento seriam necessárias as seguintes configurações: No projeto de exemplo na segunda parte do artigo em Blog um objeto SelectionTracker será utilizado junto a um fragmento, incluindo as configurações necessárias para que o fragmento não seja sobrescrito por um novo na atividade host.
  • 26. Definindo quais e quantos itens podem ser selecionados Para a definição de quais e quantos itens podem ser selecionados, podemos utilizar uma implementação de SelectionTracker.SelectionPredicate. A seguir a classe Predicate:
  • 27. Quando realizando testes, o método canSetStateAtPosition() não é invocado em nenhum momento. Agora a inserção de uma instância de Predicate na configuração de selectionTracker:
  • 28. Executando o projeto e tentando mais de uma seleção ou então tentando a seleção no item de ID 54 (Cargo, FIAT), temos: Clique aqui para abrir a animação
  • 29. Ouvidor de mudança de estado de item É possível colocar um Observer junto a instância de SelectionTracker para ouvir às mudanças de estado dos itens: A parametrização de SelectionObserver deve ser do tipo da chave estável definido em ItemKeyProvider.
  • 30. Obtendo itens selecionados, selecionando e removendo seleção Em código dinâmico é possível obter os itens selecionados: Na verdade as chaves estáveis dos itens selecionados é que serão retornadas. É possível selecionar e remover seleção de itens pelas chaves estáveis deles:
  • 31. Uma outra maneira de remover todas as seleções é com o método: Os métodos select() e deselect() de SelectionTracker também permitem a seleção e remoção de seleção.
  • 32. Pontos negativos • Realmente toda a exigência de classes em heranças poderia ser reduzida em métodos de um único SelectionTracker.Builder; • O método canSetStateAtPosition() de SelectionPredicate, até momento da construção deste artigo, não estava funcional; • Não há um método de remoção do objeto SelectionTracker junto ao RecyclerView alvo, algo que complica o trabalho com o SelectionTracker em delay, quando ele não é vinculado ao RecyclerView logo na configuração deste framework de lista; • A adição ou remoção de itens ao RecyclerView pode causar uma Exception caso o notifyDataSetChanged() não seja invocado logo depois da adição ou remoção e do clearSelection(). Isso, pois internamente na SelectionTracker a atualização de chaves e posições está ocorrendo somente depois do notifyDataSetChanged() ser invocado, algo não informado em documentação.
  • 33. Pontos positivos • A configuração para manter o estado dos itens, selecionados ou não, é muito simples; • A biblioteca permite que sejam definidas "n" maneiras de seleção de item e não somente por meio do toque ou clique; • É simples limitar quais itens podem ou não ser selecionados, incluindo a limitação da quantidade de itens.
  • 34. Considerações finais Obviamente que existem inúmeros algoritmos e APIs de terceiros que permitem a fácil seleção de itens em RecyclerView, mas com a biblioteca SelectionTracker, mesmo que não de maneira simples, temos muitas opções somente para a seleção de itens em RecyclerView, algo que a deixa como uma API completa. Este é o primeiro ano da biblioteca, ainda há muitos problemas, principalmente de interface pública. Algumas classes podem ser removidas no cenário de "necessidade de implementação", a ItemDetails é uma delas, pode se tornar mais um método em SelectionTracker.Builder. A API já é passível de ser utilizada em produção, segundo os testes que realizei. E agora é aguardar a evolução dela. Há outras possibilidades com a SelectionTracker, possibilidades que serão abordadas em futuros artigos do Blog.
  • 35. Fontes Conteúdo completo, em texto e em vídeo, no link a seguir: • SelectionTracker Para Seleção de Itens no RecyclerView Android. Fontes: • Create a List with RecyclerView; • Documentação oficial ItemDetailsLookup; • Documentação oficial ItemDetailsLookup.ItemDetails; • Documentação oficial ItemKeyProvider; • Documentação oficial SelectionTracker.Builder; • Documentação oficial StableIdKeyProvider; • Documentação oficial SelectionPredicate; • Android recycler view with multiple item selections; • Kotlin - Classes and Inheritance; • Add selection support to RecyclerView Selection; • Android - what is the meaning of StableIDs? - Resposta de Delyan.
  • 36. Para estudo • Treinamento oficial: • Prototipagem Profissional de Aplicativos Android. • Meus livros: • Desenvolvedor Kotlin Android - Bibliotecas para o dia a dia; • Receitas Para Desenvolvedores Android; • Refatorando Para Programas Limpos. • Redes: • Udemy; • YouTube; • Facebook; • LinkedIn; • GitHub; • Twitter; • Google Plus. • Blog App.
  • 37. SelectionTracker Para Seleção de Itens no RecyclerView Android thiengo.com.br Vinícius Thiengo thiengocalopsita@gmail.com