Anular la animación para notifyItemChanged en RecyclerView.Adapter

Bueno, tengo un RecyclerView con un adaptador y todo funciona muy bien. Los elementos del conjunto de datos ArrayList se están actualizando periódicamente. Así que los elementos y sus elementos, así como su posición en la lista de cambio. Esto se logra mediante una simple clasificación y la llamada manual de estos métodos, siempre que suceden las cosas:

// swapping two items Collections.swap(items, i, j); itemsAdapter.notifyItemMoved(i, j); // adding a new one itemAdapter.notifyItemInserted(items.size()); // when updating valus itemAdapter.notifyItemChanged(i); 

El último de los cuales, es la causa de mi miseria. Cada vez que se actualiza un elemento, se activa una pequeña animación "intermitente".

He encontrado un par de soluciones para esto:

 // disabling all animations recyclerView.getItemAnimator().setSupportsChangeAnimations(false); // or // setting the animation duration to zero, recyclerView.getItemAnimator().setChangeDuration(0); 

Pero ambos matan las animaciones cuando los elementos se mueven (intercambiados). Sólo quiero anular la animación y mantener toda esta magia. ¿Hay alguna forma de hacer esto? Y si es sobreescribir ItemAnimator, ¿alguien tiene un ejemplo simple?

¡Gracias por adelantado!

Hay un método dedicado para inhabilitar las animaciones cambiadas de elemento:

 ((SimpleItemAnimator) myRecyclerView.getItemAnimator()).setSupportsChangeAnimations(false); 

Documentos oficiales .

Sí, lo hice.

En primer lugar, obtener el código fuente de DefaultItemAnimator. Tomar el código y crear una clase llamada MyItemAnimator en su proyecto. A continuación, establezca ItemAnimator en una nueva instancia de su MyItemAnimator modificado, de la siguiente manera:

 recyclerView.setItemAnimator(new MyItemAnimator()); 

Ahora, vaya en el código fuente de las nuevas clases y localice el método

 animateChangeImpl(final ChangeInfo changeInfo) { ... } 

Simplemente tenemos que localizar las llamadas al método cambiando los valores alfa. Encuentre las dos líneas siguientes y elimine los valores de α (0) y α (1)

 oldViewAnim.alpha(0).setListener(new VpaListenerAdapter() { ... } newViewAnimation.translationX(0).translationY(0).setDuration(getChangeDuration()).alpha(1).setListener(new VpaListenerAdapter() { ... } 

al igual que

 oldViewAnim.setListener(new VpaListenerAdapter() { ... } newViewAnimation.translationX(0).translationY(0).setDuration(getChangeDuration()).setListener(new VpaListenerAdapter() { ... } 

Pequeña variación de la respuesta de Alex.

En lugar de eliminar el cambio alfa por completo, lo redujo. Los únicos cambios necesarios eran:

  //changed alpha from 0 ViewCompat.setAlpha(newHolder.itemView, 0.5f); 

y

  //changed alpha from 0 oldViewAnim.alpha(0.5f).setListener(new VpaListenerAdapter() { 

En ambos casos, cambie el 0 a 0.5 Esto tiene el efecto de eliminar el parpadeo asociado con el alfa va completamente a 0, pero mantiene las cualidades de transformación de la animación de cambio de elemento.

Intente establecer:

 mRecyclerview.setItemAnimator(null); 

En mi caso el reciclerview tomó todo el espacio debajo de la barra de herramientas. Todo lo que hice fue cambiar el layout_height de recyclerview de wrap_content a match_parent y parpadeando desapareció.

Si usted está modificando solamente los datos de Recyclerview significa ninguna adición o supresión del artículo entonces usted shold agrega esta línea.

 mRecyclerview.setHasFixedSize(true); 

Para que recyclerview llegue a saber que no hay cambio de tamaño después de que usted puede aplicar

 ((SimpleItemAnimator) mRecyclerview.getItemAnimator()).setSupportsChangeAnimations(false); 

Así que la animación desaparecerá y el código funcionará como encanto 🙂

  • RecyclerView java.lang.IndexOutOfBoundsException: Inconsistencia detectada. Posición de elemento no válida cuando se reanuda desde fragmento añadido
  • Android - ¿Cómo agregar una línea de separación discontinua / punteada para RecyclerView?
  • Selección única en RecyclerView
  • ¿Cómo tener un ListView / RecyclerView dentro de un RecyclerView padre?
  • Android recyclerView findViewHolderForAdapterPosition devuelve null
  • ¿Cuál es el equivalente de listview.getCount en caso de Recyclerview
  • Refrescar datos en RecyclerView y mantener su posición de desplazamiento
  • Cómo abrir una actividad diferente en recicladorVer artículo onclick
  • RecyclerView con columna fija y cabecera, además de pie de página desplazable
  • RecyclerView Deslice con una vista inferior y no detecte clic
  • Desplazamiento Horizontal Liso de Recyclerview dentro de Scrollview
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.