Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

229
Vistas
RecyclerView: permanezca en la posición 0 después de notifiyItemInserted (0)

Tengo un chat en mi aplicación y quiero que mi RV permanezca en la posición 0 cuando llegue el nuevo mensaje y la posición del primer elemento visible sea 0, pero los mensajes nuevos se agregan encima del visible actualmente, pero los elementos visibles permanecen a la vista para que el usuario tiene que desplazarse para ver el nuevo mensaje.

Mi adaptador se amplió desde RecyclerView.Adapter<RecyclerView.ViewHolder> y encontré una pequeña solución para hacerlo funcionar:

 private suspend fun update(newItems: List<IChatItem>) { var recyclerViewState: Parcelable? = null if ((recyclerView?.layoutManager as LinearLayoutManager).findFirstCompletelyVisibleItemPosition() == 0) { recyclerViewState = recyclerView?.layoutManager?.onSaveInstanceState() } val diffResult = withContext(Dispatchers.Default) { DiffUtil.calculateDiff(Diff(this.currentItems, newItems)) } diffResult.dispatchUpdatesTo(this) recyclerViewState?.let { recyclerView?.layoutManager?.onRestoreInstanceState(recyclerViewState) } }

La cosa es guardar el estado de RV y después de que DiffUtil complete su trabajo, restaurarlo. Funcionó, pero ahora estoy tratando de implementar un nuevo adaptador y extender mi clase de adaptador desde ListAdapter porque inicia DiffUtil en otro hilo. Funciona bien, pero el problema es que no puedo implementar mi solución anterior aquí, simplemente no funciona.

Intenté lo siguiente:

 override fun submitList(list: MutableList<IChatItem>?) { var recyclerViewState: Parcelable? = null if ((recyclerView?.layoutManager as LinearLayoutManager).findFirstCompletelyVisibleItemPosition() == 0) { recyclerViewState = recyclerView?.layoutManager?.onSaveInstanceState() } super.submitList(list) recyclerViewState?.let { recyclerView?.layoutManager?.onRestoreInstanceState(recyclerViewState) } }

Pero esto ya no funciona. ¿Alguien tiene una solución?

PD: Encontré esta pregunta: insertar elementos de RecyclerView en la posición cero: siempre manténgase desplazado hacia arriba , pero no creo que esta sea la mejor solución para agregar elementos invisibles vacíos en la lista del adaptador. ¿Alguna otra idea?

UPD : como pensé, debido a que este adaptador inicia DiffUtil en otro subproceso, restauró el estado de RV antes de que DiffUtil complete su trabajo. Este código funciona:

 override fun submitList(list: List<IChatItem>?) { var recyclerViewState: Parcelable? = null if ((recyclerView?.layoutManager as LinearLayoutManager).findFirstCompletelyVisibleItemPosition() == 0) { recyclerViewState = recyclerView?.layoutManager?.onSaveInstanceState() } super.submitList(list) recyclerViewState?.let { Handler().postDelayed( { recyclerView?.layoutManager?.onRestoreInstanceState(recyclerViewState) }, 1000 ) } }

Pero ofc esto no es lo que quiero. ¿Hay alguna forma de detectar cuándo DiffUtil ha terminado con todo?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Puede usar RecyclerView.AdapterDataObserver() y manejar lo que necesita.

Cree su clase de escucha que implemente RecyclerView.AdapterDataObserver()

y en el constructor de su adaptador, llame a registerAdapterDataObserver (su oyente)

y luego manejar sus devoluciones de llamadas.

Ver RecyclerView.AdapterDataObserver

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda