Gostaria de rolar para o final da lista do RecyclerView depois de carregar a atividade.
GENERIC_MESSAGE_LIST = (ArrayList) intent.getExtras().getParcelableArrayList(ConversationsAdapter.EXTRA_MESSAGE);
conversationView = (RecyclerView) findViewById(R.id.list_messages);
conversationView.setHasFixedSize(true);
conversationViewLayoutManager = new LinearLayoutManager(this);
conversationView.setLayoutManager(conversationViewLayoutManager);
conversationViewAdapter = new ConversationAdapter(GENERIC_MESSAGE_LIST, this);
conversationView.setAdapter(conversationViewAdapter);
conversationView.scrollTo(...)
lança uma exceção sobre não ser suportado no RecyclerView e conversationView.scrollToPosition(...)
parece não fazer nada.
Após o bloco de código acima, adicionei
conversationView.scrollToPosition(GENERIC_MESSAGE_LIST.size() + 1)
o que não funciona. Existem 30 elementos em GENERIC_MESSAGE_LIST
.
java
android
scroll
android-recyclerview
waylaidwanderer
fonte
fonte
scrollToPosition
imediatamente após configurar o adaptador?conversationView.setAdapter(conversationViewAdapter);
.Respostas:
Basta definir
setStackFromEnd=true
ousetReverseLayout=true
para que o LLM faça o layout dos itens do final.A diferença entre esses dois é que
setStackFromEnd
definirá a visualização para mostrar o último elemento, a direção do layout permanecerá a mesma. (Portanto, em uma Visualização de reciclagem horizontal da esquerda para a direita, o último elemento será mostrado e a rolagem para a esquerda mostrará os elementos anteriores)Considerando que
setReverseLayout
irá alterar a ordem dos elementos adicionados pelo adaptador. O layout será iniciado a partir do último elemento, que será o mais à esquerda em uma Visualização de Reciclador LTR e, em seguida, rolar para a direita exibirá os elementos anteriores.Amostra:
Consulte a documentação para obter detalhes.
fonte
Eu estava olhando para este post para encontrar a resposta, mas ... acho que todos neste post estavam enfrentando o mesmo cenário que eu:
scrollToPosition()
foi totalmente ignorado, por uma razão evidente.O que eu estava usando?
... o que funcionou ?
fonte
recyclerView.scrollToPosition(messages.size()-1);
realmente funciona para mim, eu me pergunto o motivo.smoothScrollToPosition(...)
.Eu sei que é tarde para responder aqui, ainda assim, se alguém quiser saber a solução está abaixo
fonte
conversationView.smoothScrollToPosition(conversationView.getAdapter().getItemCount() **-1**);
como as posições nas listas são baseadas em zero.Para deslocar-se de qualquer posição na vista da reciclagem para baixo
fonte
Adicione este código depois de enviar a mensagem e antes de receber a mensagem do servidor
fonte
Quando você liga
setAdapter
, isso não coloca e posiciona imediatamente os itens na tela (que recebe uma única passagem de layout); portanto, suascrollToPosition()
ligação não possui elementos reais para a rolagem quando você liga.Em vez disso, você deve registrar um ViewTreeObserver.OnGlobalLayoutListener (via addOnGlobalLayoutListner () de um
ViewTreeObserver
criado porconversationView.getViewTreeObserver()
) que atrasa seuscrollToPosition()
até após a primeira passagem de layout:fonte
OnGlobalLayoutListener
provavelmente não será removido porque você está procurandovto.isAlive()
. Eu não sei a razão, masViewTreeObserver
às vezes é alterado para umView
, então em vez de verificar paraisAlive
que você melhor apenas obter atualViewTreeObserver
comconversationView.getViewTreeObserver().removeGlobalOnLayoutListener
Solução para Kotlin :
aplique o código abaixo após a configuração "recyclerView.adapter" ou após "recyclerView.adapter.notifyDataSetChanged ()"
fonte
Em Kotlin:
fonte
GlobalLayoutListener
! Após refatorar, tive que usar seu método para rolar. Não se esqueça de remover o ouvinte como em stackoverflow.com/questions/28264139/… , ou você não rolará o RecyclerView de volta ao início.e
O código acima funciona, mas não é suave e não é legal.
fonte
Se você tiver um adaptador conectado ao recyclerView, faça isso.
mRecyclerView.smoothScrollToPosition(mRecyclerView.getAdapter().getItemCount());
fonte
A resposta do Roc é uma grande ajuda. Eu gostaria de adicionar um pequeno bloco a ele:
fonte
No meu caso, em que as visualizações não têm a mesma altura, chamar scrollToPosition no LayoutManager funcionou para realmente rolar para baixo e ver completamente o último item:
fonte
Isso funciona perfeitamente bem para mim:
fonte
Role pela primeira vez ao entrar na exibição do reciclador pela primeira vez e use
colocar em menos para rolar para baixo e rolar para cima em valor positivo);
se a vista tiver uma altura muito grande, o deslocamento específico da topologia de rolagem será usado na parte superior da vista.
fonte
Somente a resposta de Ian foi capaz de fazer meu
RecyclerView
pergaminho para uma posição especificada. No entanto,RecyclerView
não foi possível rolar depois quando eu useiscrollToPosition()
.smoothScrollToPosition()
funcionou, mas a animação inicial tornou muito lenta quando a lista era longa. O motivo foi que o ouvinte não foi removido. Usei o código abaixo para remover a correnteViewTreeObserver
e funcionou como um encanto.fonte
esse código fornecerá a última postagem primeiro, acho que essa resposta é útil.
fonte
Tentei um método de @galex , funcionou até a refatoração. Então, usei uma resposta de @yanchenko e mudei um pouco. Provavelmente, isso é porque chamei rolagem de
onCreateView()
, onde uma exibição de fragmento foi construída (e provavelmente não tinha o tamanho certo).Você também pode adicionar uma verificação
viewTreeObserver.isAlive
semelhante em https://stackoverflow.com/a/39001731/2914140 .fonte
Se nada disso funcionou,
você deve tentar usar:
Ao fazer isso, você está solicitando que um determinado ConstraintLayout (ou o que você tenha) seja exibido. O pergaminho é instantâneo.
Eu trabalho mesmo com o teclado mostrado.
fonte