android - make - Anular la animación para notifyItemChanged en RecyclerView.Adapter
recyclerview in fragment (7)
Bueno, tengo un RecyclerView con un adaptador y todo funciona muy bien. Los elementos en el conjunto de datos ArrayList se actualizan periódicamente. Por lo tanto, los elementos y sus elementos, así como su posición en la lista cambian. Esto se logra mediante una simple clasificación y llamando manualmente a estos métodos, siempre que sucedan 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 de "parpadeo".
Encontré 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 (se intercambian). Solo quiero anular la única animación y mantener toda esta magia. ¿Hay alguna forma de hacer esto? Y si está anulando ItemAnimator, ¿alguien tiene un ejemplo simple?
¡Gracias por adelantado!
En mi caso, la vista de reciclaje tomó todo el espacio debajo de la barra de herramientas. Todo lo que hice fue cambiar la altura de diseño de la vista del reciclador de wrap_content a match_parent y el parpadeo desapareció.
Hay un método dedicado para deshabilitar solo las animaciones de elementos modificados:
((SimpleItemAnimator) myRecyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
Intenta configurar:
mRecyclerview.setItemAnimator(null);
Ligera variación en la respuesta de Alex.
En lugar de eliminar el cambio alfa por completo, simplemente lo reduje. Los únicos cambios necesarios fueron:
//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 que va completamente a 0, pero mantiene las cualidades de transformación de la animación de cambio de elemento.
Sí, lo hice.
Primero, obtenga el código fuente de DefaultItemAnimator. Tome el código y cree una clase llamada MyItemAnimator en su proyecto. Luego, configure el ItemAnimator en una nueva instancia de su MyItemAnimator modificado, de esta manera:
recyclerView.setItemAnimator(new MyItemAnimator());
Ahora, vaya al código fuente de las nuevas clases y ubique el método
animateChangeImpl(final ChangeInfo changeInfo) { ... }
Simplemente tenemos que localizar las llamadas al método cambiando los valores alfa. Encuentre las siguientes dos líneas y elimine .alpha (0) y .alpha (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() { ... }
Si solo está modificando los datos de Recyclerview significa que no hay adición o eliminación del elemento, entonces debe agregar esta línea.
mRecyclerview.setHasFixedSize(true);
Para que la vista de reciclaje sepa que no hay cambios en el tamaño después de eso, puede aplicar
((SimpleItemAnimator) mRecyclerview.getItemAnimator()).setSupportsChangeAnimations(false);
Para que la animación desaparezca y el código funcione como un encanto :)
La versión de Kotlin de @Pablo A. Martínez responde:
(recyclerView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false