web-dev-qa-db-fra.com

Android RecyclerView ItemTouchHelper inverser le balayage et restaurer le support d'affichage

Existe-t-il un moyen de rétablir une action de balayage et de restaurer le support de vue à sa position initiale après le balayage est terminé et onSwiped est appelé sur le ItemTouchHelper.Callback exemple? J'ai obtenu les RecyclerView, ItemTouchHelper et ItemTouchHelper.Callback instances pour fonctionner parfaitement ensemble, j'ai juste besoin d'annuler l'action de glissement et pas de supprimer l'élément glissé dans certains cas.

51
KKB

Avec les derniers packages anndroidX, j'ai toujours ce problème, j'ai donc dû ajuster un peu la solution @ jimmy0251 pour réinitialiser correctement l'élément (sa solution ne fonctionnerait que pour le premier balayage).

 override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
                clipAdapter.notifyItemChanged(viewHolder.adapterPosition)
                itemTouchHelper.startSwipe(viewHolder)
            }

Notez que startSwipe() réinitialise correctement les animations de récupération de l'élément.

1
joecks

Dans le cas de l'utilisation de LiveData pour fournir une liste à un ListAdapter, l'appel de notifyItemChanged ne fonctionne pas. Cependant, j'ai trouvé une solution de contournement qui implique de rattacher le ItemTouchHelper à la vue du recycleur dans le rappel onSwiped en tant que tel

val recyclerView = someRecyclerViewInYourCode

var itemTouchHelper: ItemTouchHelper? = null

val itemTouchCallback = object : ItemTouchHelper.Callback {
    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction:Int) {
        itemTouchHelper?.attachToRecyclerView(null)
        itemTouchHelper?.attachToRecyclerView(recyclerView)
    }
}

itemTouchHelper = ItemTouchHelper(itemTouchCallback)

itemTouchHelper.attachToRecyclerView(recyclerView)

0
Carl B

Appelez notifyDataSetChanged sur votre adaptateur pour rendre le travail de balayage en arrière cohérent

0
Jegannath Kandasamy