Eu gostaria de mudar ListView
para RecyclerView
. Eu quero usar o onScroll
do OnScrollListener
no RecyclerView
para determinar se um usuário rolada para o final da lista.
Como sei se um usuário rola para o final da lista para que eu possa buscar novos dados de um serviço REST?
cwac-endless
paraListView
.Respostas:
Graças a @Kushal e foi assim que eu o implementei
Não esqueça de adicionar
fonte
StaggeredGridLayoutManager
mLayoutManager.findLastCompletelyVisibleItemPosition()==mLayoutManager.getItemCount()-1
findFirstVisibleItemPosition()
não resolvidos você deve mudarRecyclerView.LayoutManager
paraLinearLayoutManager
loading = true
novo?loading = true
depois da//Do pagination
parte. caso contrário, esse código será executado apenas uma vez e você não poderá carregar mais itens.Faça essas variáveis.
Defina no Scroll para visualizar a recicladora.
e para uma grade
Divirta-se com seus pergaminhos sem fim !! ^. ^
Como o Android agora suporta oficialmente o Kotlin, aqui está uma atualização para o mesmo:
Make OnScrollListener
e adicione-o ao seu RecyclerView assim
Para um exemplo de código completo, sinta-se à vontade para consultar este repositório do Github .
fonte
findFirstVisibleItemPosition()
método está disponível apenas com o LinearLayoutManager, não consigo descobrir como fazê-lo funcionar.visibleItemCount = mLayoutManager.getChildCount();
se comporta da mesma maneira que usarvisibleItemCount = mRecyclerView.getChildCount();
.int[] firstVisibleItemPositions = new int[yourNumberOfColumns]; pastVisiblesItems = layoutManager.findFirstVisibleItemPositions(firstVisibleItemPositions)[0];
Para aqueles que só querem ser notificados quando o último item é totalmente exibido, você pode usar
View.canScrollVertically()
.Aqui está a minha implementação:
Nota: Você pode usar
recyclerView.getLayoutManager().canScrollVertically()
se desejar oferecer suporte à API <14.fonte
RecyclerView
terá sorte novamente, porque você pode simplesmente fazer uma cópia estática,View.canScrollVertically()
pois os métodos relacionados são marcados como públicos em vez de protegidosRecyclerView
. Você também pode estenderRecyclerView
para reimplementar,canScrollVertically()
se quiser. Uma terceira e simples maneira é ligarrecyclerView.getLayoutManager().canScrollVertically()
. Editado na minha resposta.Aqui está outra abordagem. Ele funcionará com qualquer gerenciador de layout.
Para uma compreensão detalhada, escrevi uma postagem no blog e um exemplo de projeto, acesse aqui http://sab99r.com/blog/recyclerview-endless-load-more/
MyAdapter.java
MyActivity.java
fonte
Minha resposta é uma versão modificada do Noor. Passei de um local
ListView
onde eu tinhaEndlessScrollListener
(que você pode encontrar facilmente em muitas respostas no SO) para um,RecyclerView
então eu queriaEndlessRecyclScrollListener
que atualizasse facilmente meu ouvinte anterior.Então, aqui está o código, espero que ajude:
fonte
Para mim, é muito simples:
Cuidado com os trabalhos assíncronos: o carregamento do mL deve ser alterado no final dos trabalhos assíncronos. Espero que seja útil!
fonte
A maioria das respostas está assumindo os
RecyclerView
usos aLinearLayoutManager
, ouGridLayoutManager
, ou mesmoStaggeredGridLayoutManager
, ou assumindo que a rolagem é vertical ou horyzontal, mas ninguém postou uma resposta completamente genérica .Usar o
ViewHolder
adaptador do claramente não é uma boa solução. Um adaptador pode ter mais de 1RecyclerView
usando-o. Ele "adapta" seu conteúdo. Deve ser a Visualização do Reciclador (que é a única classe responsável pelo que atualmente é exibido ao usuário, e não o adaptador responsável apenas pelo fornecimento de conteúdoRecyclerView
) que deve notificar seu sistema de que mais itens são necessários (para carga).Aqui está minha solução, usando nada além das classes abstraídas do RecyclerView (RecycerView.LayoutManager e RecycerView.Adapter):
fonte
LayoutManagers
, mas apenas um momento: mover o código de cálculo no outro método scrollListener - movê-lo paraonScrollStateChanged
em vezonScrolled
. E emonScrollStateChanged
apenas verificar:if(newState == RecyclerView.SCROLL_STATE_IDLE) { // calculation code }
Embora a resposta aceita funcione perfeitamente, a solução abaixo usa addOnScrollListener, pois setOnScrollListener foi descontinuado e reduz o número de variáveis e as condições if.
fonte
Embora haja muitas respostas para a pergunta, gostaria de compartilhar nossa experiência de criação da exibição de lista sem fim. Recentemente, implementamos o Carousel LayoutManager personalizado que pode funcionar no ciclo rolando a lista infinitamente e até um determinado ponto. Aqui está uma descrição detalhada no GitHub .
Sugiro que você dê uma olhada neste artigo com recomendações curtas, mas valiosas, sobre como criar LayoutManagers personalizados: http://cases.azoft.com/create-custom-layoutmanager-android/
fonte
Com o poder das funções de extensão do Kotlin, o código pode parecer muito mais elegante. Coloque isso em qualquer lugar que você quiser (eu o tenho dentro de um arquivo ExtensionFunctions.kt):
E então use-o assim:
Esta solução é baseada na resposta de Kushal Sharma. No entanto, isso é um pouco melhor porque:
onScrollStateChanged
vez deonScroll
. Isso é melhor porqueonScroll
é chamado sempre que existe qualquer tipo de movimento no RecyclerView, enquantoonScrollStateChanged
é chamado somente quando o estado do RecyclerView é alterado. O usoonScrollStateChanged
poupará tempo de CPU e, consequentemente, bateria.fonte
SwipeRefreshLayout's setOnRefreshListener the addOnScrolledToEnd is not working
puxei a classe interna privada PullToRefresh: SwipeRefreshLayout.OnRefreshListener {substitui diversão onRefresh () {pbViewMore !!. Visible = View.GONE pageCount = 0 courseList.clear () // chamando asynctask aqui srlNoMessageRefreshLayout !!. IsRefreshing = false swipe! ! .isRefreshing = false}}É assim que eu faço, simples e curto:
fonte
OK, eu fiz isso usando o método onBindViewHolder de RecyclerView.Adapter.
Adaptador:
Fragmento (ou Atividade) :
fonte
onBindViewHolder()
, funciona como um encanto. A implementação é pequena se comparada ao ouvinte de rolagem e é mais fácil de usar.Minha maneira de detectar o evento de carregamento não é detectar a rolagem, mas ouvir se a última visualização foi anexada. Se a última visualização foi anexada, considero o momento de carregar mais conteúdo.
fonte
Eu tentaria estender o método usado
LayoutManager
(por exemploLinearLayoutManager
) e substituirscrollVerticallyBy()
. Em primeiro lugar, eu ligariasuper
primeiro e depois verificaria o valor inteiro retornado. Se o valor for igual a0
, uma borda inferior ou superior será atingida. Então eu usaria ofindLastVisibleItemPosition()
método para descobrir qual borda é atingida e carregar mais dados, se necessário. Apenas uma ideia.Além disso, você pode até retornar seu valor desse método, permitindo o excesso de rolagem e exibindo o indicador "loading".
fonte
fonte
onScrollStateChanged()
não funcionará, pois será chamado apenas quando você alterar o estado da rolagem e não enquanto estiver rolando. Você deve usar oonScrolled()
métodoConsegui uma implementação de tipo de rolagem infinita usando essa lógica no
onBindViewHolder
método da minhaRecyclerView.Adapter
classe.Com esse código, quando o RecyclerView chega ao último item, ele incrementa a página atual e os retornos de chamada em uma interface responsável por carregar mais dados da API e adicionar os novos resultados ao adaptador.
Posso postar um exemplo mais completo se isso não estiver claro?
fonte
Para as pessoas que usam StaggeredGridLayoutManager, aqui está minha implementação, ela funciona para mim.
fonte
Existe uma biblioteca fácil de usar para esse paginado nomeado . Suporta ListView e RecyclerView (LinearLayout, GridLayout e StaggeredGridLayout).
Aqui está o link para o projeto no Github
fonte
Crie uma classe abstrata e estenda RecyclerView.OnScrollListener
em atividade (ou fragmento) adicione addOnScrollListener ao recyclerView
fonte
Eu tenho um exemplo bastante detalhado de como paginar com um RecyclerView. Em um nível alto, eu tenho um conjunto PAGE_SIZE, digamos 30. Portanto, solicito 30 itens e, se eu receber 30 de volta, solicito a próxima página. Se eu receber menos de 30 itens, sinalizo uma variável para indicar que a última página foi alcançada e paro de solicitar mais páginas. Confira e deixe-me saber o que você pensa.
https://medium.com/@etiennelawlor/pagination-with-recyclerview-1cb7e66a502b
fonte
Aqui, minha solução usando AsyncListUtil , na Web, diz: Observe que essa classe usa um único thread para carregar os dados, portanto, é adequado para carregar dados do armazenamento secundário, como disco, mas não da rede. mas estou usando o odata para ler os dados e funcionar bem. Sinto falta do meu exemplo de entidades de dados e métodos de rede. Eu incluo apenas o adaptador de exemplo.
fonte
@kushal @abdulaziz
Por que não usar essa lógica?
fonte
end_of_list
condição será chamada apenas uma vez. O sinalizador_isLastItem
é uma variável global na atividade que possui um valor padrão defalse
. O que fiz foi executar uma tarefa em segundo plano após detectar o final da lista, recuperar a próxima página e notificar o adaptador do novo conjunto de dados e, finalmente, definindo_isLastItem
como falso novamente.Tente abaixo:
fonte
LoadMoreRecyclerView
WrapperLinearLayout
// Adicione no xml como
OnCreate ou onViewCreated
callYourService
fonte
Também é possível implementar sem o ouvinte de rolagem, usando apenas a lógica pura do modelo de dados. A visualização de rolagem requer a obtenção de itens por posição, bem como a contagem máxima de itens. O modelo pode ter a lógica de segundo plano para buscar os itens necessários em blocos, em vez de um por um, e fazer isso no encadeamento em segundo plano, notificando a visualização quando os dados estiverem prontos.
Essa abordagem permite que a fila de busca que prefere os itens solicitados mais recentemente (tão visíveis no momento) aos envios mais antigos (provavelmente já rolados para longe), controle o número de threads paralelos a serem usados e coisas assim. O código fonte completo dessa abordagem (aplicativo demo e biblioteca reutilizável) está disponível aqui .
fonte
Existe um método
public void setOnScrollListener (RecyclerView.OnScrollListener listener)
em https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#setOnScrollListener%28android.support.v7.widget.RecyclerView.OnScrollListener%29 . Use issoEDITAR:
Substituir
onScrollStateChanged
método dentro doonScrollListener
e faça issofonte
onScrollStateChanged
onScrollStateChanged
não funcionará, pois será chamado apenas quando você alterar o estado da rolagem e não enquanto estiver rolando.onScrollStateChanged
determinar se o usuário rola para o último item?Verifique se tudo está explicado em detalhes: Paginação usando o RecyclerView De A a Z
loadMoreItems ():
no MyAdapter:
fonte
Nenhuma dessas respostas leva em consideração se a lista é muito pequena ou não.
Aqui está um pedaço de código que estou usando que funciona no RecycleViews nas duas direções.
fonte
Deixei minha aproximação. Funciona bem para mim.
Espero que ajude você.
fonte
Esta solução funciona perfeitamente para mim.
fonte