J'avais l'habitude de SwipeToDismiss bibliothèque mais maintenant j'essaye de migrer vers RecyclerView et les choses ne sont pas si évidentes, connaissez-vous des remplaçants pour cette lib? Des idées comment le mettre en application à partir de zéro?
À compter de la v22.2.0, l'équipe de support Android a inclus une classe ItemTouchHelper
qui simplifie les opérations de glisser-déposer et de glisser-déposer. Cela n’est peut-être pas aussi complet que certaines bibliothèques, mais cela vient directement de l’équipe Android.
Mettez à jour votre build.gradle pour importer la v22.2. + De la bibliothèque RecyclerView
compile 'com.Android.support:recyclerview-v7:22.2.+'
Instancier un ItemTouchHelper avec un SimpleCallback approprié
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
[...]
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
//Remove swiped item from list and notify the RecyclerView
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
** Notez que le SimpleCallback prend dans les directions que vous souhaitez activer par glisser-déposer et les directions que vous voulez activer le glissement.
Joindre à votre RecyclerView
itemTouchHelper.attachToRecyclerView(recyclerView);
ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) {
final int position = viewHolder.getAdapterPosition(); //get position which is swipe
if (direction == ItemTouchHelper.LEFT) { //if swipe left
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); //alert for confirm to delete
builder.setMessage("Are you sure to delete?"); //set message
builder.setPositiveButton("REMOVE", new DialogInterface.OnClickListener() { //when click on DELETE
@Override
public void onClick(DialogInterface dialog, int which) {
adapter.notifyItemRemoved(position); //item removed from recylcerview
sqldatabase.execSQL("delete from " + TABLE_NAME + " where _id='" + (position + 1) + "'"); //query for delete
list.remove(position); //then remove item
return;
}
}).setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { //not removing items if cancel is done
@Override
public void onClick(DialogInterface dialog, int which) {
adapter.notifyItemRemoved(position + 1); //notifies the RecyclerView Adapter that data in adapter has been removed at a particular position.
adapter.notifyItemRangeChanged(position, adapter.getItemCount()); //notifies the RecyclerView Adapter that positions of element in adapter has been changed from position(removed element index to end of list), please update it.
return;
}
}).show(); //show alert dialog
}
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
itemTouchHelper.attachToRecyclerView(recyclerView); //set swipe to recylcerview
Ici, dans le code, si l'utilisateur glisse à gauche, AlertDialog s'affiche et si l'utilisateur sélectionne SUPPRIMER, l'élément est supprimé de la base de données et Recyclerview est actualisé. Si l'utilisateur sélectionne ANNULER, Recyclerview est en l'état.
peut-être pourriez-vous essayer cette bibliothèque:
https://github.com/daimajia/AndroidSwipeLayout
Mise à jour: Je viens de trouver une autre bonne bibliothèque que vous pouvez utiliser avec RecyclerView:
Cette bibliothèque peut être utile.Vous pouvez implémenter undo
dans OnDissmiss
use supertoast
J'ai écrit SwipeToDeleteRV bibliothèque qui prend en charge la fonctionnalité de glisser-supprimer-annuler-annuler sur les vues de recycleur. Il est basé sur ItemTouchHelper et très facile à utiliser.
J'espère que cela pourra être utile pour quelqu'un confronté aux mêmes problèmes.
Par exemple, vous pouvez définir votre vue recycleur dans une présentation XML comme d'habitude, avec quelques attributs facultatifs:
...
xmlns:stdrv="http://schemas.Android.com/apk/res-auto"
...
<io.huannguyen.swipetodeleterv.STDRecyclerView
Android:id="@+id/recycler_view"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
stdrv:border_color="@Android:color/darker_gray" // specify things like border color, border width, etc.
stdrv:delete_view_background="#cccccc"
stdrv:delete_icon="@drawable/ic_archive"
stdrv:delete_icon_height="24dp"
stdrv:delete_icon_width="24dp"
stdrv:left_delete_icon_margin="32dp"
stdrv:delete_message="@string/delete_message"
stdrv:right_delete_icon_margin="32dp"
stdrv:delete_icon_color="#000000"
stdrv:has_border="true"/>
Tous les attributs stdrv sont facultatifs. Si vous ne les spécifiez pas, les valeurs par défaut seront utilisées.
Créez ensuite un adaptateur qui sous-classe STDAdapter. Assurez-vous d'appeler le constructeur de la super classe. Quelque chose comme ça:
public class SampleAdapter extends STDAdapter<String> {
public SampleAdapter(List<String> versionList) {
super(versionList);
}
}
Ensuite, assurez-vous d’appeler la méthode setupSwipeToDelete
pour définir la fonctionnalité de balayage à supprimer.
mRecyclerView.setupSwipeToDelete(your_adapter_instance, swipe_directions);
swipe_directions
est la direction dans laquelle vous autorisez le glissement des éléments.
Exemple:
// Get your recycler view from the XML layout
mRecyclerView = (STDRecyclerView) findViewById(R.id.recycler_view);
LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
mRecyclerView.setLayoutManager(layoutManager);
mAdapter = new SampleAdapter(versions);
// allow swiping in both directions (left-to-right and right-to-left)
mRecyclerView.setupSwipeToDelete(mAdapter, ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT);
C'est ça! Pour des paramètres plus avancés (définir différents messages de suppression pour différents éléments, supprimer temporairement et définitivement des éléments, etc.), veuillez vous reporter à la page Lisez-moi du projet.