Confirmation et annuler la suppression en RecyclerView
J'ai obtenu une liste d'items simples dans RecyclerView. À l'aide de ItemTouchHelper il a été très facile à mettre en œuvre "glisser à supprimer" de comportement.
public class TripsAdapter extends RecyclerView.Adapter<TripsAdapter.VerticalItemHolder> {
private List<Trip> mTrips;
private Context mContext;
private RecyclerView mRecyclerView;
[...]
//Let adapter know his RecyclerView. Attaching ItemTouchHelper
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new TripItemTouchHelperCallback());
itemTouchHelper.attachToRecyclerView(recyclerView);
mRecyclerView = recyclerView;
}
[...]
public class TripItemTouchHelperCallback extends ItemTouchHelper.SimpleCallback {
public TripItemTouchHelperCallback (){
super(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.RIGHT);
}
@Override
public boolean onMove(RecyclerView recyclerView,
RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
//some "move" implementation
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
//AND WHAT HERE?
}
}
}
Il fonctionne bien. Cependant j'ai aussi besoin de mettre en œuvre l'annulation de la dernière action ou de la confirmation. Quelle est la meilleure façon de le faire?
Première question est de savoir comment insérer un autre point de vue dans le lieu de supprimé avec la boîte de dialogue de confirmation? Et comment faire pour restaurer glissée élément, si l'utilisateur choisit d'annuler la suppression?
- "Quelle est la meilleure façon de le faire?" -- annuler de la barre ou snack-bar. "Et comment restaurer glissée élément, si l'utilisateur choisit d'annuler la suppression?" -- mise à jour de votre modèle, puis appeler le
notify...()
méthode sur laRecyclerView.Adapter
pour indiquer ce qui a changé dans votre modèle.
Vous devez vous connecter pour publier un commentaire.
Je suis d'accord avec @Gabor qu'il est préférable de doux supprimer les articles et de les afficher sur le bouton annuler.
Cependant, je suis en utilisant Buvette pour montrer l'ANNULER. Il était plus facile à mettre en œuvre pour moi.
Je suis de passage à la Carte et au RecyclerView instance à mon ItemTouchHelper de rappel. Mon onSwiped est simple et la plupart du travail est fait par la carte.
Voici mon code (édité 2016/01/10):
La onItemRemove methos de la carte est:
La photosToDelete est une liste de tableaux champ de myAdapter. Je suis en train de faire le vrai suppression de ces éléments dans onPause() la méthode de la recyclerView hôte fragment.
Note modifier 2016/01/10:
photos.add(adapterPosition, mPhoto);
. Avant de cliquer surUndo
, la carte de position pourrait changer, vous devez passer titulaire deonItemRemove()
java.lang.IndexOutOfBoundsException: Invalid index -1, size is 4
int mAdapterPosition = viewHolder.getAdapterPosition();
j'ai modifié votre réponse à l'adapter à mon but, s'il vous plaît pouvez-vous confirmer si cela fonctionne pour vous?final int mAdapterPosition = viewHolder.getAdapterPosition();
à l'extérieur de la onClickListener. Juste après le snack-bar de la déclaration d'éviter IndexOutOfBoundsException. Ce qui concerne.L'approche habituelle est de ne pas supprimer l'élément immédiatement après coup. Mettre en place un message (il pourrait être un casse-croûte ou, comme dans Gmail, un message de la superposition de l'élément juste glissée) et de fournir à la fois un délai d'attente et un bouton annuler pour le message.
Si l'utilisateur appuie sur le bouton annuler pendant que le message est visible, il vous suffit de faire disparaître le message et revenir à des conditions normales de traitement. Supprimer l'élément réel que si le délai s'écoule sans que l'utilisateur en appuyant sur le bouton annuler.
Fondamentalement, quelque chose le long de ces lignes:
Cela suppose l'existence d'un
undo
mise en page dans la rubrique viewholder, normalement invisible, avec les deux éléments, un texte (en disant Supprimé ou similaire) et un Annuler bouton.Appuyant sur le bouton supprime simplement le message. En option, appuyez sur le texte confirme la suppression et supprime l'élément immédiatement en appelant le rappel approprié dans votre code. N'oubliez pas de rappeler à votre adaptateur
notifyItemRemoved()
:onSwiped()
, vous pouvez simplement cacher l'ensemble de l'annuler agencement avec sessetVisibility()
.J'ai essayé JirkaV de la solution, mais il jetait un
IndexOutOfBoundsException
. J'ai été en mesure de modifier sa solution fonctionne pour moi. Merci de l'essayer et laissez-moi savoir si vous rencontrez des problèmes.Comment il fonctionne
Lorsque l'utilisateur glisse, un snack-bar est montré et ce point est retiré de l'ensemble de données, d'où:
Depuis les données utilisées dans le remplissage de la recyclerView est à partir d'une base de données SQL, le glissée élément n'est pas supprimé de la base de données à ce stade.
Lorsque l'utilisateur clique sur le bouton "ANNULER", le lecteur élément est tout simplement ramené et le recyclerView passe à la position de l'viens de re-ajout d'élément. Donc ceci:
Puis, quand la buvette rejette, j'ai vérifié si la buvette a été rejeté par l'utilisateur en cliquant sur le bouton "ANNULER". Si non, j'ai supprimer l'élément de la base de données à ce stade.
Il y a probablement des problèmes de performances avec cette solution, je n"ai pas trouvé. S'il vous plaît si vous remarquez l'un, de chute de votre commentaire.
Je l'ai trouvé beaucoup plus simple de faire un dialogue confirmation de la suppression de travail:
Noter que: