recyclerview delete and adding android swipe android-recyclerview

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



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.