Estou procurando uma maneira de rolar RecyclerView
para mostrar o item selecionado no topo.
De uma maneira ListView
eu pude fazer isso usando scrollTo(x,y)
e obtendo o topo do elemento que precisa ser centralizado.
Algo como:
@Override
public void onItemClick(View v, int pos){
mylistView.scrollTo(0, v.getTop());
}
O problema é que RecyclerView
retorna um erro ao usar seu scrollTo
método dizendo
O RecyclerView não suporta rolagem para uma posição absoluta
Como posso rolar RecyclerView
para colocar o item selecionado na parte superior da visualização?
fonte
Se você estiver procurando pelo LinearLayout Manager vertical, poderá obter uma rolagem suave usando um costume
LinearSmoothScroller
:use uma instância do gerenciador de layout na visualização de reciclagem e, em seguida, a chamada
recyclerView.smoothScrollToPosition(pos);
suavizará a rolagem para a posição selecionada até o topo da visualização do recicladorfonte
getHorizontalSnapPreference()
as listas TopSnappedSmoothScroller for Horizontal.RecyclerView
? O que significa dizer: Isto não parece trabalho para o último item - independentemente dosSNAP_TO_START
osRecyclerView
únicos pergaminhos até que o item se torna visível na parte inferior, mas não movê-lo todo o caminho até. Alguma idéia de como conseguir isso? (Eu tenho trabalhado em torno isso definindo estofamento personalizado noRecyclerView
, mas que não parece muito certo ...)// Pos. Item de rolagem
fonte
Você só precisa ligar
recyclerview.scrollToPosition(position)
. Isso é bom!Se você quiser chamá-lo no adaptador, deixe seu adaptador ter a instância de recyclerview ou a atividade ou fragmento que contém recyclerview, do que implementa o método
getRecyclerview()
neles.Espero que possa ajudá-lo.
fonte
mesmo com regulador de velocidade
fonte
Experimente o que funcionou para mim legal!
Crie uma variável
private static int displayedposition = 0;
Agora, para a posição do seu RecyclerView em sua atividade.
Coloque essa declaração no local em que deseja que o site anterior seja exibido em sua exibição.
Bem, é isso, funcionou bem para mim \ o /
fonte
basta chamar esse método simplesmente:
ao invés de:
fonte
o que eu fiz para restaurar a posição de rolagem após atualizar o RecyclerView no botão clicou:
obtendo o deslocamento do primeiro item visível a partir do topo antes de criar o objeto linearLayoutManager e depois de instancia-lo, o scrollToPositionWithOffset do objeto LinearLayoutManager foi chamado.
fonte
Não sei por que não encontrei a melhor resposta, mas é realmente simples.
Sem erros
Cria animações
fonte
rolar na posição específica
e isso me ajudou muito. pelo ouvinte de clique, você pode obter a posição no seu adaptador
fonte
fonte
Nenhuma das respostas explica como mostrar os últimos itens na parte superior. Portanto, as respostas funcionam apenas para itens que ainda possuem itens suficientes acima ou abaixo deles para preencher o restante
RecyclerView
. Por exemplo, se houver 59 elementos e um 56º elemento for selecionado, ele deverá estar no topo, como na figura abaixo:Nós poderíamos lidar com esses casos usando
linearLayoutManager.scrollToPositionWithOffset(pos, 0)
e uma lógica adicional noAdapter
deRecyclerView
- adicionando uma margem de costume abaixo do último artigo (se o último item não é visível, então isso significa que há espaço suficiente preenchimentoRecyclerView
). A margem personalizada pode ser uma diferença entre a altura da vista raiz e a altura do item. Portanto, seuAdapter
paraRecyclerView
seria da seguinte maneira:fonte
No meu caso,
RecyclerView
tenho um top de estofamento como esteEntão, para rolar um item para o topo, preciso
fonte
Se a sua
LayoutManager
éLinearLayoutManager
você usascrollToPositionWithOffset(position,0);
nele e ele vai fazer o seu item o primeiro item visível na lista. Caso contrário, você pode usarsmoothScrollToPosition
noRecyclerView
diretamente.Acabei usando o código abaixo.
fonte
Eu uso o código abaixo para rolar suavemente um item (thisView) até o topo.
Também funciona para o GridLayoutManager com visualizações de diferentes alturas:
Parece funcionar suficientemente bem para uma solução rápida.
fonte
thisPosition
?