Carregando Dados no ListView Com OnScrollListener e Volley no Android

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 /Carregando Dados no ListView Com OnScrollListener e Volley no Android

Carregando Dados no ListView Com OnScrollListener e Volley no Android

Vinícius Thiengo
(10334) (16)
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ítuloTest-Driven Development: Teste e Design no Mundo Real
CategoriaEngenharia de Software
Autor(es)Mauricio Aniche
EditoraCasa do Código
Edição1
Ano2012
Páginas194
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?

Na vídeo aula acima nós vamos estudar e praticar o popular:

Carregamento de conteúdos em uma lista Android assim que o final desta lista de itens é alcançado.

Esse algoritmo é também conhecido como "infinite scrolling" ou "pagination".

Aqui o foco será: carregar mais itens assim que o último item da lista está presente em tela.

Mas a lógica de negócio poderá ser ajustada por você de acordo com as necessidades de seu projeto de aplicativo Android.

Ou seja, é possível iniciar o carregamento de mais itens remotos a partir do penúltimo item em lista, por exemplo.

Note que estaremos utilizando os seguintes recursos (nativos e não nativos) Android para construir todo o algoritmo de carregamento de mais conteúdos remotos:

  • ListView sendo o framework de lista para a apresentação dos conteúdos, itens;
  • OnScrollListener para ouvir o scroll do ListView;
  • Volley API para conexão remota com o backend Web e consequentemente envio e carregamento de dados;
  • Universal Image Loader API para o carregamento de imagens remotas em ImageView;
  • Componente visual ProgressBar para trabalhar como proxy. Ou seja, mostrar ao usuário que algo está sendo carregado (mais dados da Web) e que ele deve aguardar o final do carregamento.

Basicamente o algoritmo no lado Android se resume na utilização dos recursos acima.

Mas é imprescindível que você se esforce para conseguir entender todo o fluxo de carregamento de mais conteúdos de um backend Web.

Digo isso, pois hoje em dia eu utilizaria alguns outros recursos. Recursos mais modernos e recomendados pela própria comunidade de desenvolvedores Android.

E esses outros recursos ainda permitiriam conseguir o mesmo tipo de carregamento de conteúdo remoto.

Não tem porque ficar fazendo rodeios... eu utilizaria hoje os seguintes recursos:

  • RecyclerView sendo o framework de lista;
  • Listener de scroll do próprio RecyclerView;
  • Retrofit API para conexão remota com o backend Web. Para mim, disparada a melhor API Android para conexões remotas;
  • Picasso API para carregamento de imagens remotas;
  • E continuaria com o ProgressBar sendo o proxy de carregamento de conteúdo.

Note que quando eu vinculo o ProgressBar ao proxy na verdade estou informando que é com o ProgressBar que estaremos implementando em projeto o Padrão Proxy.

Em resumo:

O Padrão Proxy é o popular "loading..." que aparece em inúmeros softwares e games por aí.

É este padrão que informa de maneira implícita que "alguma coisa está sendo carregada por de baixo dos panos devido à ação do usuário".

Bom, voltando ao conteúdo do projeto de exemplo...

... por isso é importante você entender todo o fluxo de carregamento de conteúdos no backend Web.

Pois assim será trivial utilizar esse mesmo fluxo já comum em aplicativos Android, porém com recursos mais avançados e atuais.

Animação do aplicativo Android de exemplo com carregamento de conteúdos remotos

Um detalhe importante ainda sobre o fluxo do algoritmo do conteúdo desta vídeo aula:

Dê uma atenção especial também à flag isThereMore.

Pois é com ela que evitamos as tentativas desnecessárias de carregamento de mais conteúdo remoto quando na verdade já temos em aplicativo Android a informação de que não há mais conteúdo a ser carregado do backend Web.

Se você ignorar essa flag, será inevitável o consumo desnecessário da banda de Internet (3G, 4G, ...) do usuário de seu aplicativo... sem falar também do maior consumo de bateria, devido às conexões remotas desnecessárias.

Sobre o backend Web...

... este é todo desenvolvido em PHP (servidor Apache). Mas foi desenvolvido de uma maneira que você consiga entender que qualquer outra configuração de backend pode ser utilizada.

Configuração com outras linguagens de backend, por exemplo: Java, Python, Kotlin, Pearl, Ruby on Rails, ...

Então é isso.

Antes de finalizar deixo alguns bons links de outros artigos aqui do Blog, com vídeos, que lhe colocarão em dia com o que há de novo no desenvolvimento de aplicativos Android:

E caso você tenha o desejo de aprender a desenvolver apps Android, ou apenas evoluir nesta área, também com os conteúdos gratuitos do Blog, então não deixe de acessar o "Artigo Universidade Android": 

E também não esqueça de se inscrever 📫 na lista de e-mails do Blog para receber os conteúdos de desenvolvimento Android em primeira mão... e também as versões em PDF desses conteúdos (versões em PDF são liberadas somente aos inscritos da lista de e-mails).

Se inscreva também no canal do Blog no YouTube para acompanhar as últimas novidades disponibilizadas em vídeo.

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

Obs. : o link para download dos projetos (Android e Web) apresentados em vídeo aula se encontra logo abaixo no artigo, na seção "Download".

Abraço.

AndroidX

Apesar do conteúdo sobre a "Carregamento de Mais Itens Remotos em Lista" ainda estar atual e ser importante para qualquer nível de desenvolvedor Android.

Apesar disso eu também recomendo, assim que finalizado o projeto em sua própria instalação de IDE, que você o migre para o AndroidX.

Algo que pode ser feito com poucos cliques, como apresentado no tutorial a seguir: Migrar para o AndroidX.

Fontes

Documentação oficial AbsListView.OnScrollListener Android

Utilizando BaseAdapter Para Personalização Completa da ListView

Parcelable no Android, Entendendo e Utilizando

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

Cortando Imagens Com a Lib Cropper no AndroidCortando Imagens Com a Lib Cropper no AndroidAndroid
TextJustify Lib Com SpannableString no AndroidTextJustify Lib Com SpannableString no AndroidAndroid
Slides no Android Com a Lib AndroidImageSliderSlides no Android Com a Lib AndroidImageSliderAndroid
Ícones Com Bootstrap Lib no AndroidÍcones Com Bootstrap Lib no AndroidAndroid

Compartilhar

Comentários Facebook

Comentários Blog (16)

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...
Wanderson Sangreal (1) (0)
28/01/2016
Oppa Vinícius, tranquilo!?

Então cara, vi o vídeo esses dias pois estava precisando implementar  essa ideia e resolvi utilizar as dicas do vídeo com Volley. O problema é que algumas bibliotecas que o Volley utiliza já não estão sendo mais utilizadas depois da v5.1 do android, que são as do org.apache.http.*, mais precisamente no arquivo "android-volley/src/main/java/com/android/volley/toolbox/BasicNetwork.java".

Mesmo utilizando a ultima versão 1.0.19 ele não consegue fazer a requisição e retorna 404, no arquivo VolleyConn (do vídeo).

Vi que está especificado nos "commites" que foi corrigido e mudaram para "HttpURLConnection", só que talvez não tenham mudado esse arquivo (BasicNetwork.java) em particular.

A questão é, o que posso fazer exatamente para suprir esse erro e fazer com que funcione nas novas versões (6.*), pelo menos de mudanças relacionadas ao vídeo, ou fazendo Override nessa classe em específico...!? Lembrando que iniciei com desenvolvimento em android a pouco e tempo e não tenho muito conhecimento nem liberdade suficiente pra fazer isso... Muito obrigado desde já!
Responder
Vinícius Thiengo (0) (0)
30/01/2016
Fala Wanderson, blz?
Remova o Volley e utilize o Retrofit 2.0 (http://www.thiengo.com.br/library-retrofit-2-no-android ), esse é mais simples e eficiente. Abraço
Responder
Paul Polidoro (1) (0)
20/06/2015
E ai Vinícius, tudo tranquilo?
Preciso de uma ajuda sua, tenho uma lista que baixa exibe dados do tipo noticia(titulo, autor, descrição, etc), cada noticia tem o seu id especifico, quero que quando toquem no titulo da noticia abra uma activity com o id dela como parametro. Teria alguma dica??
Responder
Vinícius Thiengo (0) (0)
21/06/2015
Fala Paul, td blz sim.
Faça o seguinte, utilize uma lista de objetos Noticia, então além dos atributos titulo, imagem, descrição essa classe Noticia tb teria o atributo id. Quando o item for clicado da ListView / RecyclerView seu script acessa o item da lista de objetos do tipo Noticia, pois no listener de clique é retornada a posição que recebeu o clique, que por sinal é a mesma posição na lista de objetos. Então pegue o id e envie pela Intent que chamará a próxima Activity. Baixe algum dos últimos scripts dessa série que estou fazendo (http://www.thiengo.com.br/lib-fresco-para-carregamento-de-imagens-com-gifs-e-webps-animados-material-design-android-parte-12 ), pois lá faço algo parecido. Abraço
Responder
10/06/2015
Ôpa blz? eu queria que você fizesse um tutorial de usa alguns widget em fragments de preferência o ListView espero que possa ajudar vlw
Responder
Vinícius Thiengo (0) (0)
10/06/2015
Fala João Nicolau, blz sim.
Vc diz a View ListView sendo utilizada no fragment, por exemplo? Dê uma olhada nessa série (https://www.youtube.com/playlist?list=PLBA57K2L2RIKq7_IpaZRTL96CyLNDzF2F ), nela abordo o RecyclerView (que ;e mais eficiente que o ListView) dentro do fragment (depois de alguns vídeos essa migração de Activity para fragment acontece). Dê uma olhada. Abraço
Responder
16/10/2015
Vlw pela dica gosto muitos dos seus videos obs:se escreve com i no final, "Nicolai" kkk
Responder
27/05/2015
Bom dia Thiengo ! tudo tranquilo. Parabéns pelo vídeo , testando o projeto percebi que a aplicação ao trazer mais registros  para preencher a tela  acaba carregando novamente alguns imagensLoader que já tinham sido exibidos,  Dá a ideia de que ele está processando novamente os registros que já foram carregados.  Na classe CarAdapter eu removi o setimagebitmap  no holder e aparentemente deu uma melhorada.  Aproveitando como sugestão  esse projeto utilizando o Recyclerview no lugar do listview ficaria show de bola. Obrigado !
Responder
Vinícius Thiengo (1) (0)
27/05/2015
Fala Luiz, blz sim.
A ideia foi essa mesmo, não coloquei mts itens no servidor, apenas alguns, depois ele começa a repetir. Vlw a dica do Recycler, estou para fazer ele mesmo. Abraço
Responder
Davi Menezes (1) (0)
09/03/2015
Eae Thiengo blz? Tem algum vídeo que você fala sobre o porque você não usa o ImageLoader do Volley e sim do UniversalImageLoader? neste vídeo vc usa do UniversalImageLoader. Queria saber por quê. Abç e obrigado pelo post.
Responder
Vinícius Thiengo (1) (0)
10/03/2015
Fala Davi, blz?
No vídeo do Universal Image Loader falei que se vc para escolher optaria por ele, mas depois daquele vídeo tive relato de a lib não funcionar mt bem e sigo um canal no YouTube (slidnerd) onde o camarada tb utiliza o ImageLoader... e utilizando em meus scripts agora realmente o ImageLoader é aparentemente a melhor forma de carregar imagens, porém ando utilizando tb o picasso (https://github.com/square/picasso ), que é mt bom e ainda tem efeito de fade (padrão Material Desing) e nos permite utilizar bordas arredondas de fora mais tranquila, mas mesmo assim notei que para carregar a imagem o ImageLoader é ainda mais poderoso. Abraço
Responder
wiliam (3) (0)
23/02/2015
Fala Thiengo tudo blz? Cara existe a possibilidade de eu importa esse projeto no eclipse?
Responder
Vinícius Thiengo (1) (0)
24/02/2015
Fala Wiliam, blz sim.
O que pode fazer é copiar as classes e pacotes Java do projeto, setar o Volley no Eclipse e então rodar o seu novo projeto, pois a conversão automática de AndroidStudio para Eclipse se não me engano não tem como realizar, pois o Eclipse não dá esse suporte. Abraço
Responder
06/02/2015
Boa tarde,
Ótimo tutorial, mas estou com uma dúvida... Como é que eu poderia realizar essa mesma atividade usando json e separando os resultados com itensheaders?

Abraço
Responder
Vinícius Thiengo (2) (1)
07/02/2015
Fala Igor, blz?
O exemplo está trabalhando com os dados sendo devolvidos em string, mas o script Android entende em JSON, pois o formato da String é JSON, porém se quiser tudo em JSON (envio tb) veja os vídeos abaixo que fiz sobre esse assunto tb:

http://www.thiengo.com.br/volley-no-android-entendendo-e-utilizando

http://www.thiengo.com.br/parser-json-no-android-entendendo-e-utilizando

Quanto aos ItensHeader, na verdade a solução que vejo é seu script remoto (linguagem backend e bd) informar no JSON, pode ser via flag, para cada item se ele é um header ou apenas um item, e assim no script Android vc identifica essa condição de header e monta o ListView ou ExpandableListView corretamente. Abraço
Responder
07/02/2015
Muito obrigado pelas dicas Thiengo.. Irei estudar todos os vídeos, continuem sempre com essas ótimas aulas.
Abraço
Responder