Android Glisser-Déposer et Glisser avec RecyclerView


Exemple

Vous pouvez implémenter les fonctionnalités de glisser-déplacer et de glisser-déposer avec RecyclerView sans utiliser de bibliothèques tierces.
Utilisez simplement la classe ItemTouchHelper incluse dans la bibliothèque de support RecyclerView.

Instanciez ItemTouchHelper avec le rappel SimpleCallback et, selon la fonctionnalité que vous prenez en charge, vous devez remplacer onMove(RecyclerView, ViewHolder, ViewHolder) et / ou onSwiped(ViewHolder, int) et attacher enfin à votre RecyclerView .

ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
        // remove item from adapter
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            final int fromPos = viewHolder.getAdapterPosition();
            final int toPos = target.getAdapterPosition();
            // move item in `fromPos` to `toPos` in adapter.
            return true;// true if moved, false otherwise
        }
    
};

ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);

Il convient de mentionner que le constructeur de SimpleCallback applique la même stratégie de balayage à tous les éléments de RecyclerView . Dans tous les cas, il est possible de mettre à jour la direction de balayage par défaut pour des éléments spécifiques en getSwipeDirs(RecyclerView, ViewHolder) simplement la méthode getSwipeDirs(RecyclerView, ViewHolder) .

Supposons par exemple que notre RecyclerView inclue un HeaderViewHolder et que nous ne souhaitons évidemment pas lui appliquer de glissement. Il suffira de remplacer getSwipeDirs comme suit:

@Override
public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    if (viewHolder instanceof HeaderViewHolder) {
        // no swipe for header
        return 0;
    }
    // default swipe for all other items
    return super.getSwipeDirs(recyclerView, viewHolder);
}