Em um RecyclerView, sou capaz de rolar de repente para a parte superior de um item selecionado usando:
((LinearLayoutManager) recyclerView.getLayoutManager()).scrollToPositionWithOffset(position, 0);
No entanto, isso move abruptamente o item para a posição superior. Quero passar para o topo de um item sem problemas .
Eu também tentei:
recyclerView.smoothScrollToPosition(position);
mas não funciona bem, pois não move o item para a posição selecionada para o topo. Simplesmente rola a lista até o item na posição ficar visível.
protected int getHorizontalSnapPreference() { return LinearSmoothScroller.SNAP_TO_START; }
. Além disso, eu tive que implementar o método abstratopublic PointF computeScrollVectorForPosition(int targetPosition) { return layoutManager.computeScrollVectorForPosition(targetPosition); }
.para isso, você deve criar um LayoutManager personalizado
use isso para o seu RecyclerView e chame smoothScrollToPosition.
exemplo:
isso rolará para o topo do item RecyclerView da posição especificada.
espero que isto ajude.
fonte
smoothScrollToPosition
. Por que esse problema pode ocorrer? Obrigado.Esta é uma função de extensão que escrevi no Kotlin para usar com a
RecyclerView
(com base na resposta de @Paul Woitaschek):Use-o assim:
fonte
Podemos tentar assim
fonte
Substitua a função calculDyToMakeVisible / calculDxToMakeVisible em LinearSmoothScroller para implementar a posição Y / X de deslocamento
fonte
A maneira mais fácil que encontrei de rolar a
RecyclerView
é a seguinte:fonte
eu usei assim:
fonte
Obrigado, @droidev pela solução. Se alguém procurando a solução Kotlin, consulte o seguinte:
fonte
CustomLinearLayout.kt:
Nota: O exemplo acima está definido na direção HORIZONTAL, você pode passar VERTICAL / HORIZONTAL durante a inicialização.
Se você definir a direção como VERTICAL , altere " CalculateDxToMakeVisible " para " CalculeDyToMakeVisible " (lembre-se também do valor de retorno de chamada de supertipo)
Activity / Fragment.kt :
fonte
Provavelmente, a abordagem @droidev é a correta, mas eu só quero publicar algo um pouco diferente, que basicamente faz o mesmo trabalho e não requer extensão do LayoutManager.
Uma NOTA aqui - isso funcionará bem se o seu item (aquele que você deseja rolar no topo da lista) estiver visível na tela e você quiser apenas rolar para o topo automaticamente. É útil quando o último item da sua lista tem alguma ação, que adiciona novos itens à mesma lista e você deseja focar o usuário nos novos itens adicionados:
A idéia é simples: 1. Precisamos obter a coordenada superior do elemento de revisão de reciclagem; 2. Precisamos obter a coordenada superior do item de exibição que queremos rolar para o topo; 3. No final, com o deslocamento calculado, precisamos fazer
200 é apenas um exemplo de valor inteiro codificado que você pode usar se o item do visualizador não existir, porque isso também é possível.
fonte
Quero abordar mais detalhadamente a questão da duração da rolagem , que, se você escolher uma resposta anterior, variará de maneira dramática (e inaceitável) de acordo com a quantidade de rolagem necessária para alcançar a posição de destino a partir da posição atual.
Para obter uma duração de rolagem uniforme, a velocidade (pixels por milissegundo) deve ser responsável pelo tamanho de cada item individual - e quando os itens tiverem dimensões fora do padrão, será adicionado um novo nível de complexidade.
Pode ser por isso que os desenvolvedores do RecyclerView implantaram a cesta muito difícil para esse aspecto vital da rolagem suave.
Supondo que você queira uma duração de rolagem semi-uniforme e que sua lista contenha itens semi-uniformes , será necessário algo como isto.
PS: Maldito seja o dia em que comecei a converter indiscriminadamente o ListView em RecyclerView .
fonte
Você pode reverter sua lista
list.reverse()
e, finalmente, ligarRecylerView.scrollToPosition(0)
fonte