RecyclerView, Material Design Android - Parte 2

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes! Você receberá um email de confirmação. Somente depois de confirma-lo é que eu poderei lhe enviar os conteúdos semanais exclusivos. Os artigos em PDF são entregues somente para os inscritos na lista.

Email inválido.
Blog /Android /RecyclerView, Material Design Android - Parte 2

RecyclerView, Material Design Android - Parte 2

Vinícius Thiengo
(24072) (111)
Go-ahead
"O método consciente de tentativa e erro é mais bem-sucedido que o planejamento de um gênio isolado."
Peter Skillman
Prototipagem Android
Capa do curso Prototipagem Profissional de Aplicativos
TítuloAndroid: Prototipagem Profissional de Aplicativos
CategoriasAndroid, Design, Protótipo
AutorVinícius Thiengo
Vídeo aulas186
Tempo15 horas
ExercíciosSim
CertificadoSim
Acessar Curso
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
Lendo
TítuloManual de DevOps: como obter agilidade, confiabilidade e segurança em organizações tecnológicas
CategoriaEngenharia de Software
Autor(es)Gene Kim, Jez Humble, John Willis, Patrick Debois
EditoraAlta Books
Edição
Ano2018
Páginas464
Conteúdo Exclusivo
Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba gratuitamente conteúdos Android sem precedentes!
Email inválido

Tudo bem?

No vídeo acima daremos continuidade a série de vídeos sobre o Material Design no Android, desta vez falando sobre o melhor framework de lista deste sistema operacional mobile, melhor em termos de performance, principalmente de performance em relação ao espaço de memória disponibilizado ao aplicativo. Falaremos sobre o componente RecyclerView.

Componente que veio para substituir os antigos e muito utilizados frameworks de lista: ListView e GridView. Substituir inclusive as entidades de apoio a ambos os frameworks, entidades como o SimpleAdapter.

Devido a algumas implementações internas já presentes no RecyclerView, facilitando ainda mais a vida do desenvolvedor que escolhe utilizar este componente, ele se torna muito mais eficiente do que às duas antigas outras opções de framework de lista, ListView e GridView, que ainda não estão depreciadas.

Note que se você já utiliza ou o ListView ou o GridView, será provavelmente impactante descobrir que a implementação do padrão ViewHolder do RecyclerView é sim muito similar à implementação deste mesmo padrão nos outros dois frameworks de lista, mas a melhora de performance quando utilizando o RecyclerView vai além de somente o uso do ViewHolder.

Vale ressaltar que quando citamos ListView e GridView, que são componentes que ainda podem ser utilizados, pois não estão depreciados, nem mesmo sinalizados como possíveis APIs a serem depreciadas, estamos citando também, mesmo que implicitamente, as atividades ListActivity e GridLayout, que fazem uso destes componentes.

Voltando ao RecyclerView... uma das grandes vantagens no uso deste framework de lista é o trabalho com LayoutManager, entidade que permite mudar a configuração de apresentação de itens (lista ou grid) com uma simples mudança de objeto de LayoutManager, sem a necessidade de mudar todo o framework de lista em uso, algo que ocorre na transição de ListView para GridView e vice-versa.

Como acontece com os outros dois frameworks de lista, o RecyclerView também precisa de entidades extras para poder funcionar. Aqui temos:

  • LayoutManager (no vídeo trabalharemos com o LinearLayoutManager) que é responsável pela redenrização da View de cada item na tela do aparelho;
  • Adapter que é responsável por vincular os dados da lista de objetos passada a ele, vincular à View (que será a View, layout, de cada item do RecyclerView) e então enviar essa View ao LayoutManager;
  • ViewHolder que é responsável pela cache das Views criadas no método onCreateViewHolder() para posteriormente reutiliza-las.

Importante: no vídeo eu acabei pulando a parte de apresentação do RecyclerView na horizontal. Mas, acredite, é muito simples a alteração. Basta ir na mesma linha em que coloquei LinearLayoutManager.VERTICAL e alterar para LinearLayoutManager.HORIZONTAL.

Outro ponto importante: fique atento quanto a implementação do ouvidor de clique no RecyclerView, pois até a época de construção desta aula não havia um método simples para está funcionalidade, e o que está sendo apresentado em vídeo é ainda válido.

As implementações dos outros LayoutManagers e do CardView já estão disponíveis nesta série sobre o Material Design Android.

E como um último inventivo:

Mesmo que o RecyclerView seja um framework de lista que exija mais codificação boilerplate, ele é sim muito mais eficiente do que as outras duas principais opções e tende a melhorar a experiência do usuário de seu aplicativo Android.

Antes de finalizar mais este artigo (não deixe de assistir à vídeo aula), deixo a seguir alguns links de conteúdos aqui do Blog, com vídeos, que lhe colocarão em dia com o que há de novo no desenvolvimento mobile:

E caso você tenha como meta aprender a construir projetos Android, ou evoluir nesta área, também com os conteúdos gratuitos do Blog, então não deixe de acessar a lista de estudos em: Estudando Android - Lista de Conteúdos do Blog.

E... não esqueça de se inscrever 📫na lista de e-mails do Blog para receber todos os conteúdos Android em primeira mão.

Se inscreva também no canal do Blog no YouTube para acompanhar as últimas novidades disponíveis lá e aqui no Blog.

Surgindo dúvidas ou dicas, pode enviar abaixo na área de comentários que logo eu lhe respondo.

Obs. : o link para download do projeto apresentado em vídeo se encontra logo abaixo no artigo, na seção "Download".

Abraço.

Aula anterior

Está, "RecyclerView, Material Design Android - Parte 2", é a 2ª aula da série Material Design no Android. A aula anterior, caso você ainda não tenha estudado, que também contém vídeo e artigo, é a seguinte:

Próxima aula

A próxima aula a está, a 3ª aula, é a seguinte:

É importante que você siga todas as aulas na ordem correta para poder tirar o máximo da série e assim evoluir como esperado no mundo do desenvolvimento de aplicativos Android.

Códigos do projeto

Para ter acesso aos códigos completos do projeto desenvolvido na série Android Material Design, basta entrar nos repositórios GitHub a seguir:

Fontes

Create a List with RecyclerView

RecyclerView - documentação oficial Android

RecyclerView.LayoutManager — Material Design for Pre-Lollipop Devices!

LinearLayoutManager - documentação oficial Android

RecyclerView.Adapter - documentação oficial material Design

RecyclerView.ViewHolder - documentação oficial Android

Grokking Android - A First Glance at Android’s RecyclerView

Slidenerd - RecyclerView

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes!
Email inválido

Relacionado

Obtendo Localização Com Location API no Android - Parte 1Obtendo Localização Com Location API no Android - Parte 1Android
Tracking Com Location API, JobScheduler e Google Maps V2 no Android - Parte 4Tracking Com Location API, JobScheduler e Google Maps V2 no Android - Parte 4Android
Busca Por Locais Próximos, Location API Android - Parte 5Busca Por Locais Próximos, Location API Android - Parte 5Android
Toolbar, Material Design Android - Parte 1Toolbar, Material Design Android - Parte 1Android

Compartilhar

Comentários Facebook

Comentários Blog (111)

Para código / script, coloque entre [code] e [/code] para receber marcação especifica.
Forneça seu nome válido.
Forneça seu email válido.
Forneça o comentário.
Enviando, aguarde...
Douglas (1) (0)
13/08/2019
olá thiengo tudo bem?
Estou com dificuldade em reproduzir esse método "getSetCarList" em kotlin.
poderia me dar uma força fazendo favor?
Responder
Vinícius Thiengo (1) (0)
13/08/2019
Douglas, tudo bem aqui.

Se possível, coloque no PasteBin ( https://pastebin.com/ ) todo o código Kotlin da classe que contém o método getSetCarList().

O problema está na invocação dele em código cliente da classe que o contém ou na estrutura dele, também em Kotlin, na classe que o contém?

Abraço.
Responder
Daniel Oliveira Rangel (1) (0)
17/10/2018
Olá Thiengo, poderia me dizer como faço para atualizar o recyclerview sempre que quiser? Por exemplo, quero pegar um dado no IntentService e quando eu pegar esse valor, ele atualizasse na tela mudando a imagem para um ponto verde, ou um simbolo de ok. E qual seria a melhor forma de fazer isso, enviando um valor para o banco e que diz que foi obtido o valor ou envia do intentservice para o recyclerview e atualiza? Obrigado e abraço.
Responder
Vinícius Thiengo (0) (0)
18/10/2018
Daniel, tudo bem?

Para ser fácil a atualização do RecyclerView, primeiro recomendo que a lista de objetos vinculada ao adapter do RecyclerView seja uma variável de instância e não uma variável local, o mesmo para o objeto adapter deste framework de lista.

Assim, independente do local da classe (atividade ou fragmento) que obtiver um novo objeto (ou os novos dados para a atualização de algum já em lista), será possível colocar este novo objeto na lista e então acionar a atualização em tela pelo adapter.

Atualização acionada com algum dos dois método a seguir do adapter do RecyclerView:

-> adapter.notifyDataSetChanged()

-> adapter.notifyItemChanged()

Daniel, se me lembro bem, em ao menos um dos dois conteúdos que falo sobre o RecyclerView, eu falo sobre estratégias de atualização deste framework de lista. Além do conteúdo desta página, o outro é o:

-> Animação, onLongPress e GridLayoutManager em RecyclerView, Material Design Android - Parte 3: https://www.thiengo.com.br/animacao-onlongpress-e-gridlayoutmanager-em-recyclerview-material-design-android-parte-3

Daniel, sobre a melhor forma, na verdade não existe uma, isso depende das necessidade de seu domínio de problema.

Se for mais simples obter o novo dado de um IntentService, então utilize a comunicação com este componente, caso contrário, utilize o banco de dados que você faz uso em seu app.

Abraço.
Responder
Daniel Oliveira Rangel (1) (0)
19/10/2018
Obrigado pela ajuda Thiengo. Você me deu uma luz aqui. Eu já havia feito uma aula sua que ensina a usar o LocalBroadcastManager para enviar dados do IntentService e quando eu recebi esses dados, atualizei o adapter com adapter.notifyDataSetChanged().

Sempre aprendo com você e continue assim ajudando as pessoas que irá longe :)
Obrigado novamente e abraço.
Responder
Elivelton F (1) (0)
02/05/2018
Recuperar através do BD firebase com um ouvinte.
Responder
Elivelton F (1) (0)
02/05/2018
Tem como recuperar esse item removido , em outra lista. Tipo recuperar em uma lista de carros removidos?
Responder
Vinícius Thiengo (0) (0)
06/05/2018
Elivelton, tudo bem?

Tem como sim. Exatamente como você apontou no outro comentário, em outras palavras: utilizando uma persistência para salvar o item removido, salvando-o em uma hierarquia de "itens removidos".

Falei hierarquia, pois você citou o Firebase Database, base NoSQL que não utiliza tabelas.

A ressalva é que todo esse algoritmo de:

-> Obter o objeto removido da tela;

-> Remove-lo também da hierarquia atual da base NoSQL;

-> Salva-lo em uma outra hierarquia da base NoSQL;

-> Apresenta-lo em uma lista de itens removidos.

Tudo isso deverá ser construído na mão pelos desenvolvedores do projeto, pois não há uma API nativa (ou de terceiro) que permita fazer essa tarefa, isso devido a ser algo muito específico de domínio do problema.

Abraço.
Responder
Diogo Gonçalves (1) (0)
22/12/2017
Boa noite, existe alguma forma de fazer o efeito semelhante ao AutoCompleteTextView com um RecyclerView.

Explicando melhor... gostaria de ter um campo de texto para o usuário digitar o que procura e , conforme ele vá digitando, o RecyclerView vai atualizando a lista.

Abraço.
Responder
Vinícius Thiengo (0) (0)
23/12/2017
Diogo, tudo bem?

Uma possível maneira de conseguir essa característica é:

-> Implementar a Interface TextWatcher no EditText de entrada de dados do usuário. Exemplo de implementação: https://stackoverflow.com/a/8543479/2578331;

-> Colocar no método onTextChanged() o algoritmo que vai acessar a base de dados (local ou remota);

-> Assim que os dados forem retornados em onTextChanged(), de acordo com o valor do primeiro parâmetro deste método, limpe a lista de dados, list.clear(), que está vinculada ao adapter do RecyclerView (é para limpar e não para criar outra) e coloque os novos objetos nela;

-> Acesse o objeto adapter do RecyclerView e então invoque nele o método onNotifyDataSetChanged();

Seguindo o roteiro anterior, os novos dados, de acordo com a digitação do usuário, aparecerão no framework de lista, RecyclerView. Alias o roteiro acima é válido para qualquer outro framework de lista no Android: ListView, GridView, ...

Diogo, recomendo que somente utilize o método onTextChanged() do TextWatcher se a base de dados para busca não for uma convencional em um backend Web (Apache, MySQL e cia).

Isso, pois rapidamente seu aplicativo consumirá a banda de Internet do usuário, quando fora do WiFi, e o delay de atualização será não previsível, podendo ser rápido e também muito lento. O "muito lento" é mais provável de ocorrer em 3G / 4G.

Caso não queira desde o início implementar o roteiro anteriormente descrito, você pode buscar por APIs de terceiros que permitam o mesmo processamento e funcionalidade em seu app com poucas linhas de código. Veja algumas APIs Recycler no link a seguir:

-> https://android-arsenal.com/tag/199?sort=rating

Abraço.
Responder
Diogo Gonçalves (1) (0)
23/12/2017
Boa tarde irmão, então... segui esse mesmo raciocínio, porém utilizei o onQueryTextChange do SearchView.

Roteiro da minha aplicação: Todos os dados são buscados uma única vez em um WebService e retornado em um ArrayList.

Então, usando o onQueryTextChange do SearchView eu busco pelo texto digitado dentro do ArrayList(retornado pelo webservice) e crio um novo ArrayList validando a busca do usuário com o List.contains().

Sobre o consumo de 3g, é viável carregar todos os dados de uma só vez ? Aproveitando o ensejo, tem algum material sobre consumo de internet pra indicar ?

Abraço.
Responder
Vinícius Thiengo (0) (0)
25/12/2017
Diogo,

É viável o carregamento completo somente se o conjunto de dados raramente recebe atualização, por exemplo: lista de cidades atendidas pela sua empresa (se não forem muitas).

E se não é uma quantidade grande. A lista de todas as cidades do Brasil é algo grande a ser carregado de uma base remota, +5000 municípios.

Quando tenho uma lista de dados a serem apresentados no app e a base é remota, mesmo tendo suporte de base local, busco carregar o suficiente de itens para preencher duas telas: se aparecem cinco em uma tela cheia, carrego de 10 em 10.

Quanto mais dados carregados, maiores os: delay de entrega; espera do usuário; e banda de Internet consumida. Este último porque pode ser que seu app carregue dados que o usuário nunca venha a acessar, então a máxima de que "de qualquer forma ele terá de carregar os dados" não é válida.

Tem somente um domínio de problema que trabalhei que exigia todos os dados sempre no aplicativo: app de venda e verificação de ingressos.

Para isso, domínios que exigem todos os dados no app, recomendo que trabalhe também com notificações push: assim que confirmada a venda do ingresso, envie uma notificação completa, com os dados do usuário que obteve o ingresso, aos devices do usuário criador do evento para serem salvos na base local.

O GcmNetworkManager é uma outra API que permitirá que seu aplicativo, junto a API de notificação, obtenha aos poucos os dados da base remota.

A seguir alguns links do Blog, respectivamente, sobre notification e GcmNetworkManager:

-> https://www.thiengo.com.br/fcm-android-dominio-do-problema-implementacao-e-testes-com-servidor-de-aplicativo-parte-1

-> https://www.thiengo.com.br/gcmnetworkmanager-para-execucao-de-tarefas-no-background-android

Evite o "baixar tudo de uma vez", tive sérios problemas com isso, principalmente porque a Internet disponível no local não era boa.

Diogo, sobre o algoritmo de verificação de consumo de Internet, não tenho ainda. Até busquei, pois seria um conteúdo interessante no canal, mas até o momento... nada.

Se encontrar algo, não deixe de compartilhar aqui, se possível.

Abraço.
Responder
Robson (1) (0)
04/10/2017
Thiengo blz, meu caro com o conteúdo disponibilizado por ti eu já trabalho a um bom tempo com a Recycleview, uma das coisas que me chamou atenção é que vc mostrou como interagir com click de duas formas e se não me engano a primeira bem mais fácil utilizando interfaces. Eu não cheguei a precisar até hoje de fazer o LongClick e dei continuidade usando a simplicidade da primeira mais para minha surpresa não esta surtindo efeito conforme abaixo onde sera que errei ou o que pode estar dando errado? sera que o onLongClick só daquela outra forma (mais trabalhosa) ?
class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,  View.OnLongClickListener {
@Override
        public void onClick(View v) {
            if (itemClickListener != null){
                itemClickListener.onClick(v, getAdapterPosition());
            }
        }

        @Override
        public boolean onLongClick(View v) {
            if (itemClickListener != null) {
                itemClickListener.onLongClick(v, getAdapterPosition());
                return true;
            }
            //v.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
            return false;
        }
Responder
Vinícius Thiengo (1) (0)
04/10/2017
Robson, tudo bem aqui.

Alguma mensagem de warning é apresentada nos logs do Android Studio quando você tenta o onLongClick?

Trabalhando com o LogCat, conseguiu averiguar se ao menos o código do onClick() e onLongClick() é acionado? Ou somente um dos dois?

Em seu código, onde coloca a atribuição do listener de clique long, setOnLongClickListener(), ao objeto de item? Deveria estar no construtor do ViewHolder do adapter.

Abraço.
Responder
Robson (1) (0)
06/10/2017
Meu caro, eu vacilei aqui faltou este carinha aqui
  public MyViewHolder(View itemView) {
            super(itemView);

            itemView.setOnClickListener(this);
            // faltou este carinha aqui
            itemView.setOnLongClickListener(this);
Responder
Vinícius Thiengo (0) (0)
11/10/2017
Robson, ok.

As atribuições de listeners estão corretas, mas e sobre o LogCat e os acionamentos, verificou?

Abraço.
Responder
02/01/2017
Olá Vinicius, Parabéns pelo blog!

Estou com uma dificuldade com recyclerView, se puder me ajudar.
Implementei um recyclerview em uma fragment onde eu tenho uma condição dentro do meu onBindViewHolder que faz a sequinte verificação, se a data do post é a mesma da anterior eu escondo o header com a data do meu item. Quando chamo o fragment ele vem correto, mas se eu faço um scroll ao voltar para o inicio os itens vira uma bagunça, os itens do dia 03 vai para o dia anterior fotos da postagem aparece em outra.
Já passou por algo semelhante, Valew!!!
Responder
Vinícius Thiengo (0) (0)
03/01/2017
Rafael, tudo bem?

O que tem que ficar atento no RecyclerView é que os layouts de itens são reaproveitados para os próximos itens da lista.

Sabendo disso, em seu onBindViewHolder(), sempre verifique o layout atual, digo, verifique de acordo com o item atual, se Views que tinham sido escondidas devem ainda permanecer escondidas.

Pois pode ser que layout atual foi utilizado anteriormente em um item com dados completamente diferentes do item atual.

A logica de comparação da data do item atual com a data do item anterior, não vejo problemas em ser sempre a mesma, independente da direção do scroll.

Se mesmo com o dito aqui você não consiga resolver o problema, coloque no PasteBin (http://pastebin.com/index.php ) o código de seu onBindViewHolder() e compartilhe o link aqui.

Se possível coloque também em um servidor gratuito de imagem, o print do problema no APP, digo, da tela do device apresentando o problema. Abraço.
Responder
04/01/2017
Parece que ele se perde quando a lista fica escondida ele pega os valores das próximas. Como verifico o layout atual? Coloquei o código no pastebin com getItemViewType e o onBindViewHolder().
http://pastebin.com/e0Y1t01k

Imagens: https://drive.google.com/drive/folders/0B0uZA2kx8H-UUUk1RC1rUTFGMlk?usp=sharing
Responder
Vinícius Thiengo (0) (0)
05/01/2017
Rafael, vi seu código aqui, veja se as alterações a seguir ajudam com a correção.

Primeiro, em seu onBindViewHolder(), logo no início do método você tem a seguinte linha:

event = events.get(position);

Mesmo assim, algumas vezes no código ainda do onBindViewHolder() você persisti utilizando as invocações com a a seguir:

events.get(position).getUpdatedAt()

Não faça isso, sempre utilize o event do início do método:

event.get(position).getUpdatedAt()

Segundo, no condicional final do método onBindViewHolder, o a seguir:

if (dataLast.equals(dataNew)) {
myViewHolder.header.setVisibility(View.GONE);
}
else {
myViewHolder.data.setText(dateFull);
}

Caso o item event atual não dê true no teste if (dataLast.equals(dataNew)), porém ele esteja reutilizando o um layout de um item que era true para este teste, neste caso o header continua não visivel, quando, aparentemente, era para estar.

Com isso, tente com este condicional alterado, como abaixo:

if (dataLast.equals(dataNew)) {
myViewHolder.header.setVisibility(View.GONE);
}
else {
myViewHolder.header.setVisibility(View.VISIBLE);
myViewHolder.data.setText(dateFull);
}

Como o RecyclerView trabalha com a reutilização de layouts, quando um condicional tiver algumas Views alteradas (cores e visibilidade, por exemplo) o resultado negativo da condicional tem que ter todo o código inverso do resultado positivo.

Caso contrário os estados das Views serão utilizados de maneira incorreta. Faça as modificações apresentadas e veja se assim funciona sem problemas. Abraço.
Responder
Rafael Kowal (1) (0)
06/01/2017
Fiz as alterações sugeridas, mas o erro continua, essa imagem é a ordem correta https://drive.google.com/file/d/0B0uZA2kx8H-UNHhOWmN2OTFGUXc/view?usp=sharing ao rolar o recyclerview e voltar para o topo o item do dia 02 de janeiro passa a ter 2 itens https://drive.google.com/file/d/0B0uZA2kx8H-URkJxME5UUFJXaUk/view?usp=sharing
ele ainda esta se perdendo em algum lugar.
Responder
Vinícius Thiengo (0) (0)
06/01/2017
Rafael, vejo o problema na lógica que trabalha com a variável dataLast.

Mantenha a atualização que enviei no comentário anterior, mas atualize o código condicional final do onBindViewHolder() para trabalhar com o algoritmo abaixo:

?
String dataAnt = null;
        int positionAux = position - 1;
        if( positionAux >= 0 ){
            dataAnt = Utils.getShortDateTime( events.get( positionAux ).getUpdatedAt() );
        }

        if ( dataLast.equals(dataNew)
                && (dataAnt == null || dataAnt.equals(dataNew)) ) {

            myViewHolder.header.setVisibility(View.GONE);
        }
        else {
            myViewHolder.header.setVisibility(View.VISIBLE);
            myViewHolder.data.setText(dateFull);
        }
        dataLast = dataNew;
?

O novo condicional é para verificar o valor da data do item atual com o anterior a ele na lista, o mais atual em termos de data. Se falhar, devemos subir o reader do item atual. Veja se assim funciona sem problemas. Abraço.
Responder
Ruan Alves (1) (0)
13/12/2016
opa blz? Estou com um problema, estou com informações no meu banco de dados e listo elas para o usuário, até ai tudo bem, só que eu busco novas informações usando GCMNetworkManager em tempo em tempo, muitas das vezes a app esta fechada, e quando eu abro ela as informações são carregadas do banco de dados, ate ai show, mais quando eu estou tela de listagem elas não aparecem, so quando eu mudo de tela e volto para a listagem que carrego as informações novamente. Então o que eu queria saber é como vou atualizar a minha lista automaticamente ex: whatsapp quando a novas notificações se precisar sair da tela e voltar, no meu caso tenho muitas informações em tempo em tempo ...
Responder
Vinícius Thiengo (1) (0)
13/12/2016
Ruan, tudo bem aqui.

Uma maneira simples de fazer isso é utilizando o EventBus.

Assim que o GCMNetworkManager receber a atualização, salve ela no banco de dados loca que está sendo utilizado.

Logo depois verifique se a Activity com a lista está aberta, com um código de Activity similar ao abaixo:

class MyActivity extends Activity {
     static boolean ativa = false; /* variável estática para verificação em outras classes */

      @Override
      public void onStart() {
         super.onStart();
         ativa = true;
      }

      @Override
      public void onStop() {
         super.onStop();
         ativa = false;
      }
}


Verificado que a Activity está aberta, envie uma notificação (apenas uma variável com valor "true", por exemplo) com o EventBus.

Essa notificação será lida na Activity da lista e então seus scripts deverão acionar o banco de dados local para obter a nova lista.

Assim que a lista de dados for obtida, atualize a lista que está vinculada ao adapter do RecyclerView, mas atualize sem criar uma nova instância, por exemplo:

?
listaAdapter.clear();
listaAdapter.addAll( listaQueVeioDoBancoDeDadosLocal );
adapterDoRecyclerView.notifyDataSetChanged();
?

Não esqueça do notifyDataSetChanged(). De qualquer forma, assistindo ao vídeo acima e ao vídeo do artigo do link abaixo, você terá acesso a maneiras mais sofisticadas de atualização de um RecyclerView:

http://www.thiengo.com.br/animacao-onlongpress-e-gridlayoutmanager-em-recyclerview-material-design-android-parte-3

Ruan, dessa forma deve funcionar sem problemas. Veja que é mais lógica de negócio do domínio do problema do que tecnologia pronta no Android para nos ajudar.

Caso não conheça o EventBus, veja o artigo / vídeo do link a seguir:

http://www.thiengo.com.br/eventbus-lib-comunicacao-entre-entidades-android

Para todos os artigos do Blog que indiquei. não deixe de ler os comentários neles. Abraço.
Responder
marcelo (1) (0)
30/08/2016
Thiengo, teria como demostrar usando retrofit a paginação dos itens, exemplo carregando de 30 em 30 em um total de  500 ou 600 posso disponibilizar ate 30mil itens, posso disponibilizar o ws para vc com os itens um ws em rest .
Responder
Vinícius Thiengo (0) (0)
01/09/2016
Marcelo, blz?
Veja se assistindo aos vídeos abaixo se consegue formular a lógica de negócio para colocar essa funcionalidade em sua APP:

http://www.thiengo.com.br/carregando-dados-no-listview-com-onscrolllistener-e-volley-no-android

http://www.thiengo.com.br/volley-gson-e-retrypolicy-em-material-design-android-serie-app

Uma dica, de 30 em 30 é, provavelmente, muita coisa para a memória do device com Android, experimente carregar o suficiente para caber na tela e mais dois itens de sobressalente, caso contrário sua APP tende a ter frequentemente OutOfMemoryException. Abraço
Responder
Wendel (1) (0)
26/07/2016
iae Thiengo blz?
Segui o tutorial, por sinal está ótimo, e no final o espaçamento entre os itens do RecyclerView ficou muito grande. Já revisei o código e não achei nada de estranho.
Ps: Ainda não implementei o ScrollListener ainda, pois estou testando com uma lista de 4 elementos apenas.
Responder
Vinícius Thiengo (0) (0)
26/07/2016
Fala Wendel, blz aqui
Quando vi esse problema a solução foi alterar o android:layout_height="match_parent" do view root do layout de itens utilizado no adapter para android:layout_height="wrap_content". Tente isso para ver se funciona contigo. Abraço
Responder
Ruan Alves (1) (0)
26/04/2016
Blz Thiengo? .. Seguinte queria tirar as seguintes duvidas, quando por exemplo tenho 500 itens a ser listados, quero colocar que carregue somente 50 por cada por exemplo e colocar um icone abaixo mostrando que esta carregando, ou coisa, quando estou no tablet e minha tela é 7 polegadas, como configuro para os tamanhos das letras ficarem na adequação da tela?
Responder
Vinícius Thiengo (0) (0)
30/04/2016
Fala Ruan, blz?
Na primeira dúvida vou assumir que vc já esta carregando os 50 itens por vez, certo? Então pode utilizar um ProgressBar no bottom do layout onde ele seria ativado antes de acionar o carregamento dos 50 itens e desativado assim que houvesse uma resposta do servidor.

Quanto ao tamanho das letras, utilize todos os textos com medições "sp". Isso deve ser o suficiente. No tablet se não utilizar o espaço bem dá mesmo a impressão de que tudo é menor do que realmente é. Abraço
Responder
Ruan alves (1) (0)
02/05/2016
Blz? Fiquei confuso, sobre o tamanho da letra, se eu colocar SP, então funciona?

Sobre o carregamento, não entendi direito, por exemplo se eu tiver 500 produtos, e ao abrir a minha activity queria carregar somente 50, quando for rolando para baixo carregar mais 50, pra não precisar carregar todos os 500 e suas depedências .... se tiver algum exemplo me mande por favor ... obrigado Thiengo ... :)
Responder
Vinícius Thiengo (0) (0)
07/05/2016
Ruan, isso mesmo, a medição com SP deve funcionar, mas faz testes mesmo assim para saber se enquadra no que vc deseja.

Quanto ao carregamento, veja esse vídeo (http://www.thiengo.com.br/carregando-dados-no-listview-com-onscrolllistener-e-volley-no-android ). Nele utilizo o Volley, hj recomendo a utilização do Retrofit 2.0 (http://www.thiengo.com.br/library-retrofit-2-no-android ), veja se consegue a adaptação.

Nesse vídeo (http://www.thiengo.com.br/volley-gson-e-retrypolicy-em-material-design-android-serie-app ) tb trabalho com carregamento. Abraço
Responder
Ruan Alves (1) (0)
09/05/2016
Blz?

Sobre retrofit eu vou implementar mais é para trazer todos os dados, no caso eu preciso cadastrar no banco todos os produtos, pelo fato de trabalhar offiline, dai eu armazeno por exemplo os 500 produtos (para baixar vou implementar o retrofit, pois estou usando modo antigo sem nenhuma biblioteca), dai com esses 500 produtos ja no banco de dados, preciso listar na activity 50 po 50, para não ficar pesado a consulta e nem dados demais na actitity ....
Responder
Vinícius Thiengo (0) (0)
14/05/2016
Ruan, teste mt antes, pois lhe digo que baixar 500 registros é mta coisa para a memória do device, e listar de 50 em 50 tb é muito, veja quantos produtos cabem em uma tela do device e então carregue até duas dobras (o user consegue ver a quantidade máxima da tela e mais um pouco mais, ai sim começa a carregar mais conteúdo). Abraço
Responder
Alex Miranda (1) (0)
06/02/2016
Falae, Thiengo. Teu trabalho tá dando muita moral !!! Migrei da ListView para o RecyclerView e estou gostando bastante, apesar de ser complicado. Me tira uma dúvida, eu estou utilizando o setReverseLayout(true) para inverter a orientação da lista, e estou usando o notifyItemInserted do modo que você fez no addListItem, mas a atualização sempre aparece como se fosse position 0, mesmo eu utilizando o getItemCount. Por exemplo, eu tenho três mensagens cadastradas no banco: "Oi", "tudo bem?", "estou bem", quando eu entro com o "Que bom que está bem", a mensagem aparece antes do "Oi". Agradeço se puder me ajudar. Abraços. PS: To recomendando seu canal para geral lá da facul.
Responder
Vinícius Thiengo (1) (0)
06/02/2016
Fala Alex, blz?
Aparece antes vc diz de baixo para cima? Se sim o comportamento é esse mesmo, não? Essa foi a ultima mensagem então ela é a primeira a ser apresentada. O que está errado é o Oi ser a segunda, deve inverter a lista antes de coloca-la no Adapter se estiver realmente dessa maneira, reverte somente quando carregar na Activity na entrada do user, pois depois que ele continua a conversa, aparentemente está ok. Se não for isso volte ae. Abraço
Responder
Alex Miranda (1) (0)
07/02/2016
Fala, Thiengo... O certo seria aparecer de baixo para cima, mas estava aparecendo de cima para baixo. Quando carregava a List, aparecia certinho, quando eu adicionava um novo item, ela atualizava lá em cima, o que eu fiz para resolver foi adicionar o item no mList.add(0, message); Aí funfou... Se eu bem me recordo eu fiz essa reversão que você citou. Mais uma vez obrigado pelo seu trabalho.
Responder
Alex Miranda (1) (0)
07/02/2016
Thiengo, blz? Acabei de perceber um problema que não consigo encontrar a solução em lugar nenhum... Eu estou trazendo do BD resultados entre a conversa de duas pessoas (userA = Alinhado à Esquerda, UserB = alinhado a direita) quando a lista aparece pela primeira vez tá certinha, porém quando eu mecho o scroll, tudo se embaralha. Eu estou filtrando de acordo com o position e pego os ID referente aos contatos, e faço o filtro, mas acontece esse problema. Sem a filtragem o problema não acontece. Parece que a lista perde os números do Position.
Responder
Vinícius Thiengo (0) (0)
07/02/2016
Uma possível solução é colocar nos objetos que compõe a lista que é vinculada ao adapter... colocar nesses objetos uma flag que indicará se a mensagem é do usuário atual com o device em mãos ou não, caso sim somente coloque as mensagens de um lado, caso contrário no outro... dessa forma é bem simples e precisa de apenas um condicional. Veja se funciona ai. Abraço
Responder
Alex Miranda (1) (0)
07/02/2016
Não funfou... Se soubéssemos a causa do problema, ficaria mais fácil de resolver.
Responder
Alex Miranda (1) (0)
07/02/2016
Consegui resolver o problema utilizando o "setHasStableIds(true);" no construtor da classe. Agora surgiu um outro problema... Eu cadastrei 23 mensagens, ele carrega os 23 textviews que vão conter as mensagens, porém ele só carrega até a posição 9, então repete o conteúdo... mas agora não embaralha mais.
Responder
Alex Miranda (1) (0)
08/02/2016
Fala Thiengo, dessa vez to vindo aqui para postar a solução completa do problema, caso alguém tenha o mesmo problema, e não para te encher de pergunta. O problema e a solução: As mensagens estavam embaralhando porque uma vez que o item desaparece da view, o RecyclerView o torna inútil (Que é ótimo para o desempenho). Tentei usar o setHasStableId(true) e não funcionou, nem o setHasFixedSize(true) que já veio no seu exemplo. Tudo que eu precisei fazer foi algo complexo para qualquer desenvolvedor, setar o meu TextView como null no fim da minha condição. Vou deixar o exemplo do meu código aqui:  

public void showMessage(MyViewHolder myViewHolder, int position){

        if(mList.get(position).getFriend_id().equals("1")) {
            myViewHolder.tv_message_adm.setText(mList.get(position).getMessage());
        }else {
            myViewHolder.tv_message_adm.setText(null);
        }

        if(mList.get(position).getFriend_id().equals(idFriend)) {
            myViewHolder.tv_message.setText(mList.get(position).getMessage()m );
        }else {
            myViewHolder.tv_message.setText(null);
        }
    }

O problema no stackoverflow: http://stackoverflow.com/questions/32971046/recyclerview-change-wrong-values-on-scroll-up-down

Valeu Thiengo, abração.
Responder
Vinícius Thiengo (0) (0)
09/02/2016
Somente os 9 primeiros ou últimos? Está acessando cada posição individual da lista vinculada ao adapter? Como está seu bindViewHolder e seu ViewHolder? Abraço
Responder
Vinícius Thiengo (0) (0)
09/02/2016
Show de bola, agora somente descarte as outras perguntas que fiz. Abraço
Responder
02/01/2017
Tenho um problema semelhante ao seu, no item do meu recyclerView eu tenho um header com a data do post, essa data eu só mostro quando o item anterior tem a data diferente, faço um if dentro do OnBindViewHolder e dou um setText no textview com a data ou um visible(gone) se a data for igual, tentei utilizar o método que você utilizou mas pra mim não funcionou.
Responder
Vinícius Thiengo (0) (0)
03/01/2017
Respondido no comentário anterior.
Responder
Alexandre Ferreira (1) (0)
21/10/2015
Boa tarde Thiengo, estou desenvolvendo uma app que lista varios itens de um restaurante que busca a imagem e o nome do prato e o valor.

Estou utilizando o recyclerview juntamente com o cardview, so que ate o momento me deparei com o seguinte erro  "Binary XML file line #2: Error inflating class android.support.v7.widget.CardView"

Encontrei varios artigos falando de importar o jar do cardview mais ja estou utizando ele em meu compile "dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.android.support:appcompat-v7:23.1.0'
    compile 'com.android.support:design:23.1.0'
    compile 'me.drakeet.materialdialog:library:1.2.3'
    compile 'com.android.support:recyclerview-v7:23.1.0'
    compile 'com.android.support:cardview-v7:23.1.0'
    compile 'com.android.support:support-v4:23.1.0'
    compile 'com.github.bluejamesbond:textjustify-android:2.1.1'
    compile 'com.squareup.okhttp:okhttp:2.5.0'
'
'"

Se puder ajudar agradeço, e mais uma vez parabéns pelas aulas.
Responder
Vinícius Thiengo (0) (0)
24/10/2015
Fala Alexandre, blz?
Provavelmente já viu essa discussão (http://stackoverflow.com/questions/26675682/exception-android-view-inflateexception-binary-xml-file-line-2-error-inflat ), rodei o meu project com cardView e as libs atualizadas e foi sem problemas, seguiu esse post tb (http://www.thiengo.com.br/utilizando-cardview-material-design-android-parte-4 )? Se possível coloque o XML que está utilizando o CardView aqui para eu dar uma olhada. Abraço
Responder
jhonny (2) (0)
14/10/2015
Thiengo pq quando baixo, seus projetos nao consigo copilar eles no eclipse, eles vem em duas pastas e quando abro no eclipse fica como si tivesse um monte de projetos
Responder
Vinícius Thiengo (2) (0)
14/10/2015
Fala Jhonny, blz?
É pq os projectos mais recentes do Blog estão no formato do AndroidStudio, terá de adaptar os projetos ao Eclipse além de utilizar o gradle nele (http://www.vogella.com/tutorials/EclipseGradle/article.html ). Mas a melhor opção é utilizar tb o AndroidStudio. Abraço
Responder
Thiago (1) (0)
18/08/2015
Thiengo, primeiramente parabéns pelo tutorial.
Queria saber como faço quando clicado no item do recyclerView ele possa redirecionar para outra tela. Poderia me orientar?
No aguardo, abraço.
Responder
Thiago (1) (0)
19/08/2015
Thiengo, eu implementei a ação do click deste tutorial para mostrar o Toast, mas não está aparecendo. Você sabe o motivo?
Abraço.
Responder
Vinícius Thiengo (1) (0)
19/08/2015
Fala Thiago, blz?
Alguma mensagem de erro ou warnning está sendo apresentada no LogCat? Tentou rodar o exemplo diretamente para ver se ia sem problemas? Abraço
Responder
Thiago (1) (0)
20/08/2015
Blz Thiengo!
Consegui resolver o problema, estava faltando a linha de código: adapter.setRecyclerViewOnClickListenerHack(this);
Com base no tutorial parte 7, consegui realizar a ação do click para redirecionar para outra tela também.
Obrigado pela atenção. Parabéns pelo Blog.
Abraço
Responder
wagner (1) (0)
06/08/2015
E aí Thiengo blz. olha se você pode me ajudar, na app que estou fazendo eu tenho uma opção de filtros, só que quando aplico o filtro e não gemas registro fixa vazio. queria colocar uma mensagem de "nenhum registro encontrado" não estou conseguindo fazer isso quando não tem nada ele não passa no onbindvieholder aí não sei como pegar isso. Pode me dar umas dicas. Valeu, e parabéns pelo blog.
Responder
Vinícius Thiengo (1) (0)
07/08/2015
Fala Wagner, blz sim.
Faça o seguinte, coloque seu RecyclerView dentro de um FrameLayout, no mesmo FrameLayout coloque um TextView com o texto de mensagem vazia, porém esse TextView fica com a visibility=gone, assim que receber o resultado do filtro e nada for retornado, então o RecyclerView passa a ser gone e o TextView a ser visible (centralize o TextView) e vice-versa quando houver dados. Abraço
Responder
wagner (1) (0)
07/08/2015
Funcionou demais. Mais um vez obrigado pela ajuda.
Responder
Jonatas Oliveira (1) (0)
27/07/2015
Fala Thiengo blz?

Bom eu já havia implementado o recyclerview a algum tempo de acordo com seu video. Mas eu precisei fazer algumas alterações no meu código pra atender minha necessidade e me vi então com um Recycler dentro de um Scrolview, o acarretou em um problema. Tentei pesquisar pela web e vi que para solucionar isso podemos definir a altura do recycler progamaticamente ou botando um header no recycler. Gostaria de saber se você pode me dar alguma sugestão, pois vi que seu app calopsyta também usa algo parecido nos comentarios do pessoal.

No aguardo, abraço.
Responder
Vinícius Thiengo (0) (0)
30/07/2015
Fala Jonatas, blz?
No caso da APP do Blog não utilizo RecyclerView para os comentários, aqueles comments são montados via Java API com uso do LayoutInflater, o layout é montado com LinearLayout e outras Views (ImageView, TextView, ...), dessa forma não problemas com scroll. Se sua APP puder apresentar todos os dados que deveriam estar em um scroll, porém sem o scroll, então vc pode fazer como fiz com os comments na APP, sem RecyclerView ou ListView, porém o container continua sendo o ScrollView. Abraço
Responder
Danilo (0) (0)
16/07/2015
Thiengo, já resolvi a questão do gerado pelo adapter. No caso eu tenho uma activity de detalhes e um fragment vinculado a essa activity para carregar o objeto parcelable passado ao recyclerview. No fragment detalhe eu implementei a configuração do layout a partir dos objetos parcelables. Na intent que tem o fragment do recyclerview, eu passo o objeto parcelable para a activity de detalhe ou para o fragment correspondente ao detalhe? Eu fiz a passagem para a activity, porém deu erro, pois ele não encontrou o widgets responsáveis por montar o layout, já que criei todos no fragment. Não sei se consegui explicar direito... Desde já agradeço.. Abraço!
Responder
Vinícius Thiengo (0) (0)
17/07/2015
Então, vc passa o objeto via Intent para a Activity, pois seu fragment de detalhes somente vai existir se a Activity a qual ele está vinculado existir tb. Nesse caso vc chama o getParcelableExtra() para remontar o objeto dentro da Activity mesmo, ai para utilizar o objeto no fragment vc pode ter um construtor nesse fragment que receberá como parametro de entrada esse objeto, logo, no onCreateView() vc vem montando o layout, tendo em mente que esse é o layout do fragement que será carregado na Activity, é um layout diferente do layout da Activity. Resumo, vc vai passar para a Activity para poder passar para o fragment. Abraço
Responder
Danilo (1) (0)
09/07/2015
Bom dia Thiengo, blz? Cara, realmente colocando Fragment.this no objeto VolleyConn ele não dá erro. Porém, eu fiz essa requisição no scrollListener e deu problema de estouro de memória. Acredito que ficou em um loop infinito. Então, de tanto mexer, criei um outro método para fazer requisição a partir de um Singleton Volley e retornar a lista com os objetos de paginação. Como não faço o controle por id, conforme a sua aula, eu fiz apenas um SELECT * FROM tb_ocorrencias_aeronauticas LIMIT 20 offset $parametro; Então a cada scroll ele passa um parâmetro offset para trazer de 20 em 20 registros. Deu certo, estou conseguindo fazer o scroll agora. Agradeço muito, muito a sua ajuda. Realmente não teria conseguido com suas dicas. Agora só falta eu tirar o erro do recyclerview attached; skipping layout. Coloquei o progressBar. Como faço pra colocar outro progressbar no final da lista, pra mostrar que tem mais dados sendo carregados? Valeu meu amigo... Salvou minha situação...
Responder
Vinícius Thiengo (0) (0)
10/07/2015
Danilo, o problema do RecyclerView é com o adapter, ele não está sendo vinculado a tempo e então um RecyclerView sem adapter na screen não é permitido, logo é gerada essa Exception. Está vinculando o adapter ao RecyclerView em que método do fragment? onCreateView? Já a questão do ProgressBar, vc vai ter de bolar uma lógica para ter um no bottom, tente algo com android:layout_gravity="bottom|center" e então uma margem: android:layout_marginBottom="20dp" .Tente assim para ver se vai. Abraço
Responder
Danilo (0) (0)
10/07/2015
O adapter está sendo vinculado no método "do after", dentro do fragment. Eu tento criar ele no on create e recuperar apenas o mlist, mas ele retorna tudo branco. Valeu... Abraço
Responder
Vinícius Thiengo (0) (0)
11/07/2015
Crie ele no onCreateView(), e ainda nesse método vincule ele ao RecyclerView. A variável do adapter deve ser uma variável de instancia. No doAfter() vc apenas utiliza a variável do adapter para chamar notifyDataSetChanged() quando forem retornados os dados da Web e vinculados a lista que já está vinculada ao adapter, somente depois de todo o processo de vinculação terminar é que seu script deve chamar o notifyDataSetChanged(). Teste assim para ver se vai sem problemas. Abraço
Responder
Danilo (1) (0)
14/07/2015
Boa Tarde Thiengo, agora parece que está tudo indo certo até agora. Pra eu salvar as informações da resposta json do webservice, eu tenho que verificar a conexão em que momento? No método do before? Eu pretendo ir atualizando uma base de dados em sqlite para o usuario acessar na medida que não houver conexão e assim que tiver conectividade, ele baixar o json e inserir no banco. Em que momento vc faz no seu app do blog?? Muito obrigado pela ajuda ! Abraço
Responder
Vinícius Thiengo (0) (0)
15/07/2015
doBefore(). Na verdade a lógica que utilizo é que quando o user tenta carregar mais dados (rolando a lista para cima), naquele momento o script verifica se há conexão com a Internet, caso tenha o script solicita os dados da base remota (utilizando o Volley), caso contrário o script realiza o mesmo filtro de dados a serem carregados (filtro baseado no ultimo item já sendo apresentado) no SQLite local. Assim se houver mais dados, local ou remoto, esses são carregados na lista que já está vinculada ao adapter do RecyclerView e então é dado o refresh no adapter para atualizar a tela. Note que toda vez que os dados são carregados do servidor remoto o script, em uma Thread de background, salva esses dados no SQLite, caso eles já estejam lá, apenas os atualiza. Abraço
Responder
Danilo (1) (0)
15/07/2015
No caso essa thread em background seria a propria requisição volley utilizada na classe volleyConn e no método doAfter()? Então no momento da rolagem do scroll, ele verifica se existe conexão para entao saber se vai puxar dados do sqlite ou do bd remoto? Abraço
Responder
Vinícius Thiengo (0) (0)
16/07/2015
Na verdade verifico se há conexão com a Internet no método getMainRequest() que é quando já estou na Thread de background. Se não houver a conexão, ao invés de retornar um objeto que seja enviado na conexão Volley retorno null e então no doAfter(), se nenhum dado foi retornado de acordo com o id do ultimo item enviado, realizo a verificação na base local, que não envolve mais o Volley e sim um AsyncTask. Ai no onPostExecute() utilizo o doAfter() da variavel do fragment atual para retornar os dados para o mesmo doAfter() que o Volley deveria ter retornado. Se não houver dados, realmente não apresento mais nada.
Responder
Danilo (1) (0)
08/07/2015
Blz Thiengo? Eu consegui fazer a requisição utilizando requestData, passando parâmetro offset para requisitar consulta por paginação no servidor e retornar JSON. Porém, eu não consigo criar um objeto para fazer nova requisição VolleyConn "(new VolleyConn(getActivity(), this)).execute();" dentro do ScrollListener, pois dá erro de incompatibilidade, acusando que o parâmetro Transaction é diferente do parametro do ScrollListener. Então, eu trago a primeira lista Json, porém não consigo trazer as seguintes no ScrollListener. Outra coisa é o erro de "No adapter Attached - Skipping Layout". Eu consegui retirar esse erro criando o objeto adapter no onCreateView, fora do método doAfter (como está no exemplo do ScrollListener com ListView), mas ele só carrega a lista dos dados quando eu coloco o adapter dentro do método doAfter, depois que recebe a resposta json e adiciona os objetos na lista. Enfim, acredito que consegui avançar em termos de requisição, o OnScrollListener está funcionando, mas quando chega no último item do recyclerview ele não obtem mais objetos para adicionar a lista. Não sei se consegui explicar direito, mas se vc tiver como me dar alguma dica, ficarei muito grato por conseguir resolver essa pane que há dias me impede de prosseguir no projeto. Muito obrigado! Abraço.
Responder
Vinícius Thiengo (0) (0)
09/07/2015
Blz sim. No caso do ScrollListener, provavelmente o problema é o this, se sua Fragment está implementando o transaction como no vídeo do ListView vc na verdade deve fazer da seguinte forma:

new VolleyConn(getActivity(), NomeDoFragment.this)

Assim ele deve realizar uma nova requisição sem problemas. No caso do adapter o que tem de entender é sobre referencia de objetos na memória, ou seja, vc criando o adapter no onCreateView() e colocando vinculado a ele uma lista que vai conter os itens que serão apresentados, depois vc apenas precisa trabalhar coma lista, não crie uma outra instancia dela, se tiver de remover itens utilize o método remove() se tiver de adicionar utilize o método add(). Depois das alterações na lista que esta vinculada ao adapter, apenas chame o método notifyDataSetChanged() do adapter e então o RecyclerView deve ser atualizado. Tente ai e veja se consegue progredir, depois fale onde parou. Abraço
Responder
Danilo (1) (0)
07/07/2015
Bom dia Thiengo, mais um dia batendo cabeça com essa questão. Fiz conforme me indicaste, crei um método para fazer uma requisiçao get no volley e pegar o json com os objetos da minha classe modelo. Porém, acredito que não consegui alimentar meu array list com o resultado dessa requisição, pois quando acesso o meu fragment, o recyclerview fica com a tela toda branca. Aparentemente acho que o arraylist deverá estar vazio, pode ser isso? Eu até consegui puxar os dados, mas de outra forma, utilizando gson, mas não consegui passar os objetos gson para o array list, além do mais, nessa outra forma teve um erro de no attached recycler view; skipping layout. Mas a minha inteção é popular o array list e adicionar os itens a cada rolagem, igual vc ensinou. Não sei por onde encontrar a saída, já tentei várias formas. Muito obrigado pela atenção!
Responder
Vinícius Thiengo (0) (0)
08/07/2015
Fala Danilo, blz?
Vamos fazer o seguinte, vamos ir resolvendo em partes. O RecyclerView está em um Fragment ou Activity? A lista que deverá receber os dados do Gson, está no Fragment ou Activity? Enquanto os dados são baixados da Web seu script deixa ativo um ProgressBar? Responda essas questões e vamos por aqui resolvendo esse problema seu. Abraço
Responder
Danilo (1) (0)
08/07/2015
Blz Thiengo. O recyclerview está em um Fragment. A lista tambem está em um Fragment, eu faço a requisição volley dentro do fragment pra obter os objetos Json e converter para Gson. Eu ainda não implementei um progress bar nessa situação. Abraço.
Responder
Vinícius Thiengo (0) (0)
09/07/2015
Faça o seguinte: seu RecyclerView fica dentro de um FrameLayout e o ProgressBar vai ficar dentro desse FrameLayout tb, porém ele será o ultimo item. Antes de chamar a requisição Volley, quando vc ainda está dentro da Thread principal, seu script vai colocar o ProgressBar como progressBar.setVisibility( View.VISIBLE ), pois antes desse passo ele sempre fica como View.GONE. Não precisa esconder o RecyclerView, deixe ele como está, porém com largura e altura iguais a match_parent. Não esqueça de centralizar o ProgressBar com android:layout_gravity="center".

Assim que chamar a requisição via Volley, o ProgressBar já estará sendo apresentado, agora quando os dados chegarem em formato JSON, não os converta para Gson, não há necessidade, apenas crie os objetos do tipo de classe que vc definiu (Car, por exemplo) obtendo os dados de cada item recebido via JSON. Cada um desses objetos deve ficar dentro de um ArrayList do tipo de classe desses objetos, por exemplo: new ArrayList<Car>(); Essa lista deve ser uma varaivel de instancia, ou seja, definida dentro de escopo de classe. Faz essa parte e depois informe se conseguiu ir até o preenchimento da lista, pode deixar a parte do ProgressBar por ultimo, pois ela é mais tranquila. Abraço
Responder
Danilo (1) (0)
06/07/2015
Thiengo, fiz a implementação conforme a sua vídeo aula. Agora, é possível eu realizar uma requisição, nesse recyclerview, conforme o requestaData daquela outra video aula com listView? No caso onde implementaria o "(new VolleyConn(MainActivity.this, this)).execute();" para obter os dados via json? No exemplo acima, vc cria um arrayList temporário para inserir no recyclerview. Como eu passaria a requisição volley para o listAux? Abs e Obrigado!
Responder
Vinícius Thiengo (0) (0)
06/07/2015
Fala Danilo, blz?
A implementação será a mesma sim (o download é para a lista e não para o ListView / RecyclerView), porém um pouco adaptada, pois no onScrollListener o código do Recycler muda (no vídeo mostro como pegar o ultimo item no Recycler). No caso da chamada ao Volley, vc tem de realizar que o resultado entregue pelo Volley é relacionado fortemente com a lista que entrará no Adapter do ListView ou RecyclerView e não com essas entidades diretamente, logo vc pode chamar o Volley para a APP com RecyclerView nos mesmos lugares que na APP do ListView. Abraço
Responder
Maxweel (2) (0)
27/06/2015
Vinícius brilhante iniciativa, kra to com problema aki pra puxar os dados com volley e mostrar no recyclerview, vi os vídeos q VC recomendou aos colegas, mas MSM assim ainda ta complicado, teria como me mandar um exemplo? n precisa ser nda demorado, só um exemplo básico, agradeço desde de jah, to recomendando seus videos aki na comunidade q to montando sobre Android e desenvolvimento geek
Responder
Vinícius Thiengo (0) (0)
28/06/2015
Fala Maxweel, blz?
Os exemplos mais tranquilos que tenho são esses (http://www.thiengo.com.br/volley-no-android-entendendo-e-utilizando ) e (http://www.thiengo.com.br/carregando-dados-no-listview-com-onscrolllistener-e-volley-no-android ). O primeiro é mostrando como utilizar o Volley e o segundo é uma exemplo prático com o Volley rodando junto a um ListView. Minha dúvida é se seu problema é com a busca / envio de dados ao servidor ou se é com a lógica no banco de dados para saber quais dados obter?! Abraço
Responder
Maxweel (1) (0)
28/06/2015
vlw Vinicius,
minha dúvida maior seria quanto apresentação dos dados recebidos do webservice, pois até aí consegui fazer, porém quando chega a parte de receber os dados e mostrar no recyclerview não consegui assimilar a lógica, mas vou rever o material q VC indicou.
Responder
tporto88 (1) (0)
08/06/2015
Bom dia!
Estou seguindo os passos feitos na aula e consegui implementar tranquilamente o recyclerview, mas tenho uma duvida.  Como faço para ao clicar em uma linha do grid ela se destacar ao pressionar como no listview? Obrigado.
Responder
Vinícius Thiengo (1) (0)
08/06/2015
Fala TPorto, blz?
Para dar o highlight no item clicado dê uma olhada na resposta certa desse link do stackoverflow (http://stackoverflow.com/questions/29983848/how-to-highlight-the-selected-item-of-recycler-view ), tem outras técnicas, mas essa é a maneira mais simples de implementar em minha opinião. Abraço
Responder
Gabriel Vitor (1) (0)
05/06/2015
Olá Thiengo, blz??
eu gostaria de saber como eu teria que fazer pra colocar os itens já cadastrados no meu banco de dados MySQL nas listas do recyclerView? tipo: ao invés de eu mesmo cadastrar no código do Mobile eu puxaria do meu BD... E onde, no código, eu colocaria essas informações do meu Banco de Dados.
Desde já te agradeço...
Responder
Vinícius Thiengo (2) (0)
06/06/2015
Fala Gabriel, blz?
Se possível veja esse vídeo (http://www.thiengo.com.br/carregando-dados-no-listview-com-onscrolllistener-e-volley-no-android ) e tb baixe o código tanto Android quanto o código da parte Web.

Nesse vídeo faço exatamente o que vc está precisando, porém estou com um ListView. Mas a ideia não é vc ver como colocar no RecyclerView, na realidade vc pode consumir os vídeos de RecyclerView para ver como vincular a lista de objetos ao adapter e o adapter ao RecyclerView, isso já deve ser o suficiente. Pois quando baixamos dados da Web para nossas listas mobile, o que devemos saber é como pegar esses dados e coloca-los na lista que já está vinculada ao adapter do RecyclerView e então dar um refresh (notifyDataSetChanged) na instancia do adapter para reconstruir o Recycler com os novos dados já adicionados. Na verdade com o RecyclerView vc não utiliza o notifyDataSetChanged(), pois a atualização será brusca, logo assista tb os vídeos sobre RecyclerView que tenho, pois neles mostro uma atuailização mais suave, onde depois de preencher a lista com os novos objetos eu os coloco um por um no RecyclerView. No vídeo do ListView utilizo o JSON como o Wraper de transporte de dados, fortemente recomendo que faça isso tb. Abraço.
Responder
Grupo TI (1) (0)
24/05/2015
Ea Thiengo, blz? Primeiramente queria parabenizá-lo pelos vídeos, e tbm tirar uma dúvida. Minha dúvida é a seguinte: Eu estava com um problema em relação a carregar informações de um server e passar para o RecyclerView, estava dando a seguinte informação no Log: No adapter attached; skipping layout, e a tela de busca continuava em branca,
então eu Iniciei o adapter antes de adicionar os elementos, o Log parou de exibir o erro, porém, ainda fica sem exibir nada.
Responder
Vinícius Thiengo (0) (0)
24/05/2015
Fala ae, blz sim.
Verificou no LogCat se ao menos os dados estão chegando do sever? Tem de ter em mente que depois de ter colocado a lista de dados no Adapter do RecyclerView vc tb tem de chamar algum método de atualização, tipo: adapterRecyclerView.notifyDataSetChanged(). Fez isso? Abraço
Responder
Grupo TI (1) (0)
24/05/2015
Vlw pela resposta, mas já fiz isso, os dados estão sendo retornados, e estou usando o método de atualização. Antes eu usava uma listView e era tudo retornado perfeitamente, então fui adaptando o necessário para usar o RecyclerView, já que pode-se aproveitar boa parte do código.
Responder
Grupo TI (1) (0)
24/05/2015
Prestando mais atenção no LogCat, percebi que ele informa o erro "No adapter attached; skipping layout", antes mesmo de retornar as informações do servidor.
Responder
Vinícius Thiengo (0) (0)
24/05/2015
hum... vincule um adapter ao recyclerView, é no adapter que vc chama o notifyDataSetChanged(). Abraço
Responder
13/05/2015
Olá Thiengo,

Primeiramente parabéns por mais um excelente tutorial.
Até este momento vim utilizando a ListView, porém após assistir seu vídeo já migrei para a RecyclerView e gostei bastante.

Minha dúvida é em relação à alguns métodos que eu estava acostumado com a ListView e que não presenciei na RecyclerView. Os métodos que eu estava acostumado a utilizar com a ListView eram:

- smoothScrollToPosition(position) : este método realizava um scroll suave de forma programática para a posição passada por parâmetro (position).

- setSelection(position) : direcionava a listView para a posição passada como parâmetro (position).

Logo gostaria de saber se você sabe como posso encontrar estes métodos de forma equivalente no RecyclerView.

Grato desde já.
Responder
Vinícius Thiengo (0) (0)
14/05/2015
Fala Vinícius, blz?
O que podemos confundir no RecyclerView quando comparado ao ListView é onde chamar os método, no RecyclerView a maioria dos métodos úteis são chamadaos do LayoutManager que estamos utilizando, no caso do smoothScrollToPosition() o layoutManager (classe pai dos outros LayoutManagers) tem esse método smoothScrollToPosition() implementado (ele não é abstract como a classe).

No caso do setSelection() dê uma olhada na primeira resposta desse link (http://stackoverflow.com/questions/27377830/what-is-the-equivalent-listview-setselection-in-case-of-recycler-view ). Abraço
Responder
14/05/2015
Excelente!
Muito obrigado Thiengo.
Responder
Danilo (2) (0)
11/05/2015
Boa Noite Thiengo. Desde já agradeço a sua ajuda e atenção. Está contribuindo muito para ganho de conhecimento daqueles que frequentam seu blog. Quanto ao recyclerview, existe alguma exemplo feito no seu blog envolvendo recyclerview obtendo a lista de carro via Json? Estou utilizando sua aula de parser json utilizando listview, porém, com alguma dificuldade de migrar para recyclerview. Vc tem algum exemplo no seu blog referente a requisição Post para realização de consulta ao webservice, também retornando json a partir da utilização da consulta por um searchview? Estou desenvolvendo um app para o órgão no qual trabalho e já implementei recyclerview para obter objetos via json, mas não está tão otimizado como vc aborda nos seus vídeos. Estou utilizando AsyncTask e não a liv volley. Muito obrigado pela atenção.
Responder
Vinícius Thiengo (0) (0)
12/05/2015
Fala Danilo, blz?
Dos vídeos que tenho com JSON e Servidor Web provavelmente vc já os viu (Somente do parser JSON e do JSON com ListView), esse do JSON com RecyclerView provavelmente vou fazer nessa série do Material Design e o do SearchView tb. Se o AsyncTask com sua entidade de conexão estiver organizado e rodando já está blz, pois a grande vantagem do Volley é o encapsulamento de entidades como Thread de background. Só para garantir que viu os vídeos de JSON que mencionei, segue os links. Abraço

http://www.thiengo.com.br/carregando-dados-no-listview-com-onscrolllistener-e-volley-no-android

http://www.thiengo.com.br/parser-json-no-android-entendendo-e-utilizando
Responder
Danilo (1) (0)
12/05/2015
Entendi Thiengo. Estou tentando usar o Volley com Recyclerview. Caso não consiga, irei tentar utilizando Asynctask. Suas aulas de material design utilizando volley+recyclerview e seachview irão ajudar muito, mais do que já estão ajudando.
Desde já agradeço sua ajuda. Valeu!
Responder
Vinícius Thiengo (1) (0)
13/05/2015
Aparentemente vão mesmo, pois já tem alguns seguidores do Blog me perguntando sobre a data de lançamento dessas vídeo aulas. Assim que fizer aviso a todos. Abraço
Responder
alessandroceron9 (1) (0)
06/05/2015
Blz Vinícius, cara gostaria de saber se tem como no lugar da lista utilizar os loader e provider. Pois não encontrei nada relacionado. obrigado e continue com o ótimo trabalho att
Responder
Vinícius Thiengo (1) (0)
06/05/2015
Fala Alessandro, blz?
Com o ListView, se me lembro bem, era possível criar um CursorAdapter direto para o cursor vindo do Provider, com o RecyclerView encontrei essa discussão (http://stackoverflow.com/questions/27730747/recyclerview-content-provider-cursorloader ), segundo o ultimo comentário não há CursorAdapter para RecyclerView, porém a ideia que ele deu é a primeira que vem a cabeça, preencher uma lista com o resultado do Provider e então passar essa lista para o Adapter do RecyclerView. Abraço
Responder
Alessandro Ceron (1) (0)
06/05/2015
Tinha pensado nisso tb, porém, quando utilizo os Loader o próprio android se encarregava em atualizar os itens que eram modificados no banco, não sei se esse comportamento se manteria passando o resultado para uma lista. Abraço
Responder
Vinícius Thiengo (0) (0)
07/05/2015
Alessandro, nesse caso teria de atualizar cada item da lista novamente com o novo resultado do cursor depois da alteração no bd, ou melhor e até mais tranquilo, atualizar na lista somente os itens atualizados em bd, sem criar uma nova lista, pois assim o user nem percebe que teve uma alteração. Abraço
Responder
alessandroceron9 (1) (0)
07/05/2015
aham. Valeu pela ajuda. Continue com o ótimo trabalho, abraço
Responder
23/04/2015
Parabéns pelo vídeo, muito bom, gostaria de saber se é possível utilizar menu de contexto com a RecyclerView, meu app utiliza bastante estes menus e gostaria de substituir os ListViews por RecyclerView.
Responder
Vinícius Thiengo (1) (0)
24/04/2015
Fala Glayson, blz?
É possível sim.
Responder
13/04/2015
muito bom o tutorial, sempre aprendo muito quando tem atualização, estou muito ansioso para o próximo vídeo sobre RecyclerView
Responder
felipe.bandeiraas (1) (0)
10/04/2015
quando sai a segunda parte?
Responder
Vinícius Thiengo (0) (0)
11/04/2015
Segunda-feira Felipe. Abraço
Responder
Matheus Hofstede (1) (0)
06/04/2015
Opa blz? Vinícius, estou usando um gridview com o ultimate image loader (que a proposito descobri e vi o tutorial daqui), será que ele funciona com o recycleview ou tenho que esperar o desenvolvedor atualizar?
Responder
Vinícius Thiengo (0) (0)
07/04/2015
Blz sim Matheus. Funciona sim, não há problemas, pode utilizá-lo. Eu hj utilizo o Picasso (http://square.github.io/picasso/ ) no APP do Blog devido mais ao efeito de fade. Abraço
Responder
lucasadorno16 (4) (0)
06/04/2015
Mais um belo vídeo. Obrigado
Responder