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".
- Android: Elemento RecyclerView cuando se establece en bloques que se pueden hacer clic en eventos onTouch
- Creación de secciones dentro de RecyclerView
- Reciclaje de artículos duplicados en desplazamiento
- ¿Cómo realizar un seguimiento de los elementos seleccionados en un RecyclerView en Android?
- Algo raro sucede mientras se desplaza RecyclerView demasiado rápido
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!
- Horizontal RecyclerView con elementos que tienen altura dinámica
- Android RecyclerView: notifyDataSetChanged () IllegalStateException
- ListSelector para RecyclerView en el dispositivo táctil libre (usando onKey Listener)
- Actualizar RecyclerView.Adapter después de la intención de la cámara
- Cómo redimensionar el visor en un RecyclerView
- Deslizar para descartar para RecyclerView
- Decoración RecyclerView (con GridLayoutManager) para mostrar el divisor entre los elementos
- Android - ¿Cómo cambiar la altura de Recyclerview dinámicamente?
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 🙂
- Iterar a través de ListView y obtener valores de EditText-Field
- ¿Hay alguna manera de controlar las vistas dentro del encabezado de NavigationView?