Posso descobrir se meu ListView foi rolado para a parte inferior? Com isso quero dizer que o último item está totalmente visível.
105
Editado :
Como estive investigando esse assunto específico em uma de minhas aplicações, posso escrever uma resposta extensa para futuros leitores dessa questão.
Implementar um OnScrollListener
, definir as suas ListView
's onScrollListener
e então você deve ser capaz de lidar com as coisas corretamente.
Por exemplo:
private int preLast;
// Initialization stuff.
yourListView.setOnScrollListener(this);
// ... ... ...
@Override
public void onScroll(AbsListView lw, final int firstVisibleItem,
final int visibleItemCount, final int totalItemCount)
{
switch(lw.getId())
{
case R.id.your_list_id:
// Make your calculation stuff here. You have all your
// needed info from the parameters of this function.
// Sample calculation to determine if the last
// item is fully visible.
final int lastItem = firstVisibleItem + visibleItemCount;
if(lastItem == totalItemCount)
{
if(preLast!=lastItem)
{
//to avoid multiple calls for last item
Log.d("Last", "Last");
preLast = lastItem;
}
}
}
}
listview
forstackFromBottom
? Eu tentei,if (0 == firstVisibleItem){//listviewtop}
mas está sendo chamado repetidamente.Resposta tardia, mas se você simplesmente deseja verificar se o ListView está rolado para baixo ou não, sem criar um ouvinte de evento, você pode usar esta instrução if:
Primeiro, ele verifica se a última posição possível está à vista. Em seguida, ele verifica se a parte inferior do último botão está alinhada com a parte inferior do ListView. Você pode fazer algo semelhante para saber se está no topo:
fonte
getChildCount()
retorna as visualizações no grupo de visualizações, que com a reciclagem de visualizações não é o mesmo que o número de itens no adaptador. No entanto, como ListView desce de AdapterView, você pode usargetCount()
diretamente no ListView.Do jeito que eu fiz:
fonte
Algo no sentido de:
fonte
Isso funcionou para mim.
fonte
Isso pode ser
fonte
Foi muito doloroso lidar com a rolagem, detectar quando ela terminou e realmente está no final da lista (não na parte inferior da tela visível), e aciona meu serviço apenas uma vez, para buscar dados da web. No entanto, está funcionando bem agora. O código é o seguinte para o benefício de qualquer pessoa que enfrente a mesma situação.
NOTA: Tive de mover meu código relacionado ao adaptador para onViewCreated em vez de onCreate e detectar a rolagem principalmente assim:
Aqui, RideListSimpleCursorAdapter.REACHED_THE_END é uma variável adicional em meu SimpleCustomAdapter que é definida assim:
Somente quando essas duas condições se encontram, isso significa que estou realmente no final da lista e que meu serviço será executado apenas uma vez. Se eu não pegar o REACHED_THE_END, mesmo rolar para trás aciona o serviço novamente, desde que o último item esteja à vista.
fonte
canScrollVertically(int direction)
funciona para todas as visualizações e parece fazer o que você pediu, com menos código do que a maioria das outras respostas. Insira um número positivo e, se o resultado for falso, você está na parte inferior.ie:
if (!yourView.canScrollVertically(1)) { //you've reached bottom }
fonte
Para expandir um pouco sobre uma das respostas acima, isso é o que eu tive que fazer para que funcionasse completamente. Parece haver cerca de 6 dp de preenchimento integrado dentro de ListViews, e onScroll () estava sendo chamado quando a lista estava vazia. Isso lida com ambas as coisas. Provavelmente poderia ser um pouco otimizado, mas foi escrito mais para maior clareza.
Nota lateral: Eu tentei várias técnicas diferentes de conversão de dp em pixel, e esta dp2px () tem sido a melhor.
fonte
Não posso comentar ainda porque não tenho reputação suficiente, mas na resposta de @Ali Imran e @Wroclai acho que falta algo. Com esse pedaço de código, uma vez que você atualize o preLast, ele nunca mais executará o Log. No meu problema específico, desejo executar alguma operação toda vez que rolar para o final, mas depois que preLast for atualizado para LastItem, essa operação nunca será executada novamente.
}
Com esse "outro", agora você pode executar seu código (Log, neste caso) toda vez que rolar para o final novamente.
fonte
fonte
Para que sua lista chame quando a lista chegar pela última vez e se ocorrer um erro, isso não chamará o endoflistview novamente . Este código também ajudará neste cenário.
onde o LIST_UP_THRESHOLD_VALUE pode ser qualquer valor inteiro (eu usei 5) onde sua lista é rolada para cima e ao retornar ao final, isso chamará o fim da exibição de lista novamente.
fonte
Eu descobri uma maneira muito boa de carregar automaticamente o próximo conjunto de páginas de uma maneira que não exija a sua
ScrollView
(como a resposta aceita exige).Em ParseQueryAdapter, há um método chamado
getNextPageView
que permite que você forneça sua própria visualização personalizada que aparece no final da lista quando há mais dados para carregar, de modo que só será acionado quando você atingir o final do conjunto de páginas atual (é a visualização "carregar mais .." por padrão). Este método só é chamado quando há mais dados para carregar, por isso é um ótimo lugar para chamar.loadNextPage();
Desta forma, o adaptador faz todo o trabalho duro para você determinar quando os novos dados devem ser carregados e não será chamado se você tiver chegou ao fim do conjunto de dados.Então dentro de sua atividade / fragmento você só precisa configurar o adaptador e novos dados serão atualizados automaticamente para você como mágica.
fonte
Para detectar se o último item está totalmente visível , você pode simplesmente adicionar cálculos na parte inferior do último item visível da visualização por
lastItem.getBottom()
.fonte
Eu fui com:
fonte
No método
getView()
(de umaBaseAdapter
classe derivada) pode-se verificar se a posição da visão atual é igual à lista de itens naAdapter
. Se for esse o caso, significa que chegamos ao fim / fim da lista:fonte
Eu acho uma maneira melhor de detectar o fim da rolagem do listview na parte inferior, primeiro detecte o fim do scoll por esta
Implementação de onScrollListener para detectar o fim da rolagem em um ListView
finalmente combinar a resposta de Martijn
fonte
Muito obrigado aos pôsteres no stackoverflow! Combinei algumas ideias e criei um ouvinte de classe para atividades e fragmentos (portanto, esse código é mais reutilizável, tornando o código mais rápido de escrever e muito mais limpo).
Tudo que você precisa fazer quando você tem minha classe é implementar a interface (e claro, criar um método para ela) que está declarada na minha classe e criar um objeto dessa classe passando argumentos.
fonte
Você precisa adicionar um recurso de rodapé xml vazio ao listView e detectar se esse rodapé está visível.
Então, em seu listener de rolagem listView você faz isso
fonte
Se você definir uma tag em uma visão do último item da visão de lista, mais tarde você pode recuperar a visão com a marca, se a visão for nula é porque a visão não está mais carregada. Como isso:
então, se você precisa saber se o último item foi carregado
fonte
Janwilx72 está certo, mas é min sdk é 21, então eu crio este método:
para ScrollOrientation:
Talvez tarde, apenas para retardatários。
fonte
Se você estiver usando um adaptador personalizado com seu listview (a maioria das pessoas usa!), Uma bela solução é dada aqui!
https://stackoverflow.com/a/55350409/1845404
O método getView do adaptador detecta quando a lista foi rolada para o último item. Ele também adiciona correção para os raros momentos em que alguma posição anterior é chamada, mesmo depois que o adaptador já renderizou a última visualização.
fonte
Eu fiz isso e funciona para mim:
fonte
Isso rolará para baixo na sua lista até a última entrada.
fonte