Me gustaría desplazarme al final de la lista RecyclerView después de cargar la actividad.
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(...)
lanza una excepción sobre no ser compatible con RecyclerView, y conversationView.scrollToPosition(...)
no parece hacer nada.
Después del bloque de código anterior, agregué
conversationView.scrollToPosition(GENERIC_MESSAGE_LIST.size() + 1)
que no funciona Hay 30 elementos en GENERIC_MESSAGE_LIST
.
java
android
scroll
android-recyclerview
waylaidwanderer
fuente
fuente
scrollToPosition
inmediatamente después de configurar el adaptador?conversationView.setAdapter(conversationViewAdapter);
.Respuestas:
Simplemente establezca
setStackFromEnd=true
o mássetReverseLayout=true
para que LLM diseñe los elementos desde el final.La diferencia entre estos dos es que
setStackFromEnd
establecerá la vista para mostrar el último elemento, la dirección de diseño seguirá siendo la misma. (Por lo tanto, en una vista de reciclador horizontal de izquierda a derecha, se mostrará el último elemento y el desplazamiento hacia la izquierda mostrará los elementos anteriores)Mientras
setReverseLayout
que cambiará el orden de los elementos agregados por el Adaptador. El diseño comenzará desde el último elemento, que será el más a la izquierda en una Vista de Reciclador LTR y luego, al desplazarse hacia la derecha, se mostrarán los elementos anteriores.Muestra:
Consulte la documentación para más detalles.
fuente
Estaba mirando esta publicación para encontrar la respuesta, pero ... Creo que todos en esta publicación se enfrentaban al mismo escenario que yo:
scrollToPosition()
fue completamente ignorado, por una razón evidente.¿Qué estaba usando?
... ¿qué funcionó ?
fuente
recyclerView.scrollToPosition(messages.size()-1);
realmente funciona para mí, solo me pregunto la razón.smoothScrollToPosition(...)
.Sé que es tarde para responder aquí, aún si alguien quiere saber la solución está por debajo
fuente
conversationView.smoothScrollToPosition(conversationView.getAdapter().getItemCount() **-1**);
como las posiciones en las listas están basadas en cero.Para desplazarse hacia abajo desde cualquier posición en la vista de reciclador hacia abajo
fuente
Agregue este código después de enviar el mensaje y antes de recibir el mensaje del servidor
fuente
Cuando llama
setAdapter
, eso no establece y coloca inmediatamente los elementos en la pantalla (que requiere una sola pasada de diseño), por lo tanto, suscrollToPosition()
llamada no tiene elementos reales a los que desplazarse cuando la llama.En su lugar, debe registrar un ViewTreeObserver.OnGlobalLayoutListener (a través de addOnGlobalLayoutListner () de un
ViewTreeObserver
creado porconversationView.getViewTreeObserver()
) que retrasa suscrollToPosition()
hasta después del primer pase de diseño:fuente
OnGlobalLayoutListener
probablemente no se elimine porque lo está buscandovto.isAlive()
. No sé el motivo, pero aViewTreeObserver
veces se cambia por unView
, así que en lugar deisAlive
buscarlo mejor, simplemente póngase al díaViewTreeObserver
conconversationView.getViewTreeObserver().removeGlobalOnLayoutListener
Solución para Kotlin :
aplique el siguiente código después de configurar "recyclerView.adapter" o después de "recyclerView.adapter.notifyDataSetChanged ()"
fuente
En Kotlin:
fuente
GlobalLayoutListener
! Después de refactorizar, tuve que usar su método para desplazarme. No olvide eliminar el oyente como en stackoverflow.com/questions/28264139/… , o no desplazará RecyclerView de regreso al principio.y
el código anterior funciona, pero no es suave ni genial.
fuente
SI tiene un adaptador conectado con recyclerView, simplemente haga esto.
mRecyclerView.smoothScrollToPosition(mRecyclerView.getAdapter().getItemCount());
fuente
Roc answer es de gran ayuda. Me gustaría agregarle un pequeño bloque:
fuente
En mi caso, donde las vistas no tienen la misma altura, llamar a scrollToPosition en LayoutManager funcionó para desplazarse realmente hacia la parte inferior y ver completamente el último elemento:
fuente
Esto funciona perfectamente bien para mí:
fuente
Desplácese por primera vez cuando ingrese en la vista de reciclador por primera vez y luego use
poner menos para desplazarse hacia abajo para desplazarse hacia arriba poner en valor positivo);
si la vista es muy grande en altura, entonces se usa desplazamiento a la posición de desplazamiento particular para la parte superior de la vista y luego se usa
fuente
Solo la respuesta de Ian fue capaz de hacer que mi
RecyclerView
pergamino llegara a una posición específica. Sin embargo, TheRecyclerView
no pudo desplazarse después cuando lo uséscrollToPosition()
.smoothScrollToPosition()
funcionó pero la animación inicial lo hizo demasiado lento cuando la lista era larga. La razón fue que el oyente no fue eliminado. Utilicé el siguiente código para eliminar la corrienteViewTreeObserver
y funcionó de maravilla.fuente
este código te dará la última publicación primero, creo que esta respuesta es útil.
fuente
Probé un método de @galex , funcionó hasta refactorizar. Así que usé una respuesta de @yanchenko y cambié un poco. Probablemente esto se
onCreateView()
deba a que llamé a desplazamiento desde donde se creó una vista de fragmento (y probablemente no tenía el tamaño correcto).También puede agregar una marca de me
viewTreeObserver.isAlive
gusta en https://stackoverflow.com/a/39001731/2914140 .fuente
Si ninguno de estos funcionó,
deberías intentar usar:
Al hacer esto, está solicitando que se muestre un cierto RestraintLayout (o lo que sea que tenga). El pergamino es instantáneo.
Trabajo incluso con el teclado que se muestra.
fuente