delete - swipe recyclerview android github
Android RecyclerView ItemTouchHelper revertir deslizar y restaurar el titular de la vista (6)
Debe anular el método onSwiped
en ItemTouchHelper.Callback
y actualizar ese elemento en particular.
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder,
int direction) {
adapter.notifyItemChanged(viewHolder.getAdapterPosition());
}
¿Hay una manera de revertir una acción de barrido y restaurar el titular de la vista a su posición inicial después de que se complete el onSwiped
y se llame a ItemTouchHelper.Callback
en la instancia de ItemTouchHelper.Callback
? Conseguí que las instancias RecyclerView
, ItemTouchHelper
y ItemTouchHelper.Callback
funcionen juntas perfectamente, solo necesito revertir la acción de deslizar y no eliminar el elemento deslizado en algunos casos.
Después de algunos pinchazos al azar encontré una solución. Llame a notifyItemChanged
en su adaptador. Esto hará que la vista deslizada se anime nuevamente a su posición original.
La implementación de ItemTouchHelper
de Google supone que todos los elementos eliminados finalmente se eliminarán de la vista del reciclador, mientras que en algunas aplicaciones podría no ser el caso.
RecoverAnimation
es una clase anidada en ItemTouchHelper
que administra la animación táctil de los elementos arrastrados / arrastrados. Aunque el nombre implica que solo recupera la posición de los elementos, en realidad es la única clase que se utiliza para recuperar (cancelar el barrido / arrastrar) y reemplazar (mover hacia afuera en el deslizamiento o reemplazar al arrastrar). Nombre extraño.
Hay una propiedad booleana llamada mIsPendingCleanup
en RecoverAnimation
, que ItemTouchHelper
usa para averiguar si el elemento está pendiente de ser eliminado. Entonces, ItemTouchHelper
, después de adjuntar un RecoverAnimation
al elemento, establece esta propiedad después de un barrido exitoso, y la animación no se elimina de la lista de animaciones de recuperación mientras esta propiedad esté establecida. El problema es que mIsPendingCleanup
siempre se configurará para un elemento eliminado, lo que provocará que RecoverAnimation
para el elemento nunca se elimine de la lista de animaciones. Entonces, incluso si recupera la posición del elemento después de un barrido exitoso, se enviará de vuelta a la posición de barrido tan pronto como lo toque, ya que la Recuperación de animación hará que la animación comience desde la última posición de barrido.
Desafortunadamente, la solución para esto es copiar el código fuente de la clase ItemTouchHelper
en el mismo paquete que está en la biblioteca de soporte y eliminar la propiedad mIsPendingCleanup
de la clase RecoverAnimation
. No estoy seguro de que Google lo acepte, y aún no he publicado la actualización en Play Store para ver si causará un rechazo, pero es posible que encuentre el código fuente de la biblioteca de soporte v22.2.1 con lo anterior la corrección mencionada en https://gist.github.com/kukabi/f46e1c0503d2806acbe2 .
Llame a notifyDataSetChanged en su adaptador para que el barrido funcione de manera consistente
Si quieres ver un buen tutorial sobre las animaciones de RecyclerView Swipe & Drap, puedes ver este video, lo encontré bastante útil. https://www.youtube.com/watch?v=grRAvv-uk1c&t=1228s
UN solución sucia la solución para este problema es volver a adjuntar el ItemTouchHelper llamando ItemTouchHelper::attachToRecyclerView(RecyclerView)
dos veces, que luego llama al método privado ItemTouchHelper::destroyCallbacks()
. destroyCallbacks()
elimina la decoración del elemento y todos los oyentes, pero también borra todas las recuperaciones.
Tenga en cuenta que debemos llamar a itemTouchHelper.attachToRecyclerView(null)
primero para engañar a ItemTouchHelper
para que piense que la segunda llamada a itemTouchHelper.attachToRecyclerView(recyclerView)
es una nueva vista de reciclador.
Para obtener más información, consulte el código fuente de ItemTouchHelper
here .
Ejemplo de solución:
RecyclerView recyclerView = findViewById(R.id.recycler_view);
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback);
...
// Workaround to reset swiped out views
itemTouchHelper.attachToRecyclerView(null);
itemTouchHelper.attachToRecyclerView(recyclerView);
Considérelo como una solución sucia porque este método utiliza detalles de implementación internos e indocumentados de ItemTouchHelper
.
Actualización :
De la documentation de ItemTouchHelper::attachToRecyclerView(RecyclerView)
:
Si TouchHelper ya está conectado a un RecyclerView, primero se separará del anterior. Puede llamar a este método con un valor nulo para separarlo del RecyclerView actual.
y en la documentación de parámetros:
La instancia de RecyclerView a la que desea agregar este helper o nulo si desea eliminar ItemTouchHelper de la RecyclerView actual.
Así que al menos está parcialmente documentado.