Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android RecyclerView ItemTouchHelper revertir swipe y restaurar vista titular

¿Hay una manera de revertir una acción de deslizar y restaurar el titular de la vista a su posición inicial después de que el golpe se ha completado y onSwiped se llama en la instancia ItemTouchHelper.Callback ? Tengo las instancias RecyclerView , ItemTouchHelper y ItemTouchHelper.Callback para trabajar juntos perfectamente, solo necesito revertir la acción de deslizar y no eliminar el elemento deslizado en algunos casos.

  • ¿Es necesario llamar a Bitmap.recycle () después de usarlo (en Android)?
  • Uso de Guice para inyectar dependencias en el constructor de una actividad de Android
  • ¿Qué para establecer CursorAdapter (Contexto contexto, Cursor c, int flags) a fin de hacer que funcione con CursorLoader?
  • ¿Dónde puedo descargar la documentación de Android SDK?
  • Cualquier ejemplo que muestre cómo iniciar sesión con Facebook SDK 4.0 en Android, ya sea utilizando el botón propio o el botón de Facebook?
  • Problema de integración de Paypal en titanio
  • Gestión de memoria HttpClient
  • Lista de archivos en la carpeta de activos y sus subcarpetas
  • ¿Hay un HttpClient que maneja las solicitudes de almacenamiento en caché por sí solo?
  • Cómo usar arrastrar y soltar en la vista de reciclador utilizando la base de datos en tiempo real firebase
  • SecurityException: No se le permite iniciar el servicio Intención act = com.google.android.c2dm.intent.REGISTER
  • ¿Dónde guardar los puntos GPS de Android (latitud, longitud)?
  • 3 Solutions collect form web for “Android RecyclerView ItemTouchHelper revertir swipe y restaurar vista titular”

    Después de algunas picaduras al azar encontré una solución. Llame a notifyItemChanged en su adaptador. Esto hará que la vista desplazada vuelva a animarse en su posición original.

    La implementación de ItemTouchHelper de Google supone que cada elemento eliminado se eliminará de la vista de reciclador, mientras que podría no ser el caso en algunas aplicaciones.

    RecoverAnimation es una clase anidada en ItemTouchHelper que gestiona la animación táctil de los elementos deslizados / arrastrados. Aunque el nombre implica que sólo recupera la posición de los elementos, en realidad es la única clase que se utiliza para recuperar (cancelar deslizar / arrastrar) y reemplazar (mover hacia fuera en deslizar o reemplazar en arrastre) los elementos. Nombres extraños.

    Hay una propiedad booleana llamada mIsPendingCleanup en RecoverAnimation , que ItemTouchHelper utiliza para determinar si el elemento está pendiente de eliminación. Así que ItemTouchHelper , después de adjuntar una RecoverAnimation al elemento, establece esta propiedad después de un golpe con éxito hacia fuera, y la animación no se quita de la lista de recuperar animaciones, siempre y cuando esta propiedad se establece. El problema es que, mIsPendingCleanup siempre se establecerá para un elemento eliminado, haciendo que la RecoverAnimation para el elemento nunca se elimine de la lista de animaciones. Por lo tanto, incluso si recupera la posición del elemento después de un golpe con éxito, se le enviará de nuevo a la posición desplazada tan pronto como la toque, ya que RecoverAnimation causará que la animación empiece desde la última posición desplazada.

    La solución es, por desgracia, copiar el código fuente de la clase ItemTouchHelper en el mismo paquete que está en la biblioteca de soporte y quitar la propiedad mIsPendingCleanup de la clase RecoverAnimation . No estoy seguro de si esto es aceptable por Google y no he publicado la actualización en Play Store todavía para ver si provocará un rechazo, pero puede encontrar el código fuente de la clase de la biblioteca de soporte v22.2.1 con lo anterior Mencionado en https://gist.github.com/kukabi/f46e1c0503d2806acbe2 .

    UN Solución sucia Solución para este problema es volver a conectar 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 RecoverAnimations.

    Tenga en cuenta que necesitamos llamar a itemTouchHelper.attachToRecyclerView(null) primero para engañar a ItemTouchHelper y pensar que la segunda llamada a itemTouchHelper.attachToRecyclerView(recyclerView) es una nueva vista de reciclador.

    Para más detalles, eche un vistazo al código fuente de ItemTouchHelper aquí .

    Ejemplo de solución alternativa:

     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éralo como una solución sucia porque este método utiliza detalles de implementación internos e indocumentados de ItemTouchHelper .

    Actualización :

    De la documentación de ItemTouchHelper::attachToRecyclerView(RecyclerView) :

    Si TouchHelper ya está conectado a un RecyclerView, primero se separará del anterior. Puede llamar a este método con null para separarlo del RecyclerView actual.

    Y en la documentación de los parámetros:

    La instancia de RecyclerView a la que desea agregar este ayudante o null si desea quitar ItemTouchHelper del RecyclerView actual.

    Así que al menos está parcialmente documentado.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.