web-dev-qa-db-fra.com

Faites glisser pour rejeter pour RecyclerView

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?

115
Viktor Yakunin

À 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);
    
333
jmcdale
 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.

31
Khyati Fatania

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:

https://github.com/hudomju/Android-swipe-to-dismiss-undo

14
Pierpaolo Paolini

Cette bibliothèque peut être utile.Vous pouvez implémenter undo dans OnDissmiss use supertoast

2
codefalling

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.

2
H.Nguyen