Aujourd’hui, nous allons voir comment réaliser un Drag and Drop et un Swipe dans un RecyclerView. Je te préviens d’avance, c’est d’une simplicité déconcertante ! Mais avant ça, je t’invite à aller voir mon article qui explique ce qu’est un RecyclerView si tu n’es pas familier avec ce widget.
Nous allons voir deux notions :
Drag and Drop : ce qui va nous permettre de modifier l’ordre des items de notre liste en déplacement les éléments simplement avec le doigt
Swipe : Supprimer un item de notre liste en le faisant glisser sur le côté
Ces deux notions peuvent paraître compliqués à mettre en place, mais le RecyclerView est un widget très puissant qui nous permet d’effectuer des actions complexes comme celle-ci très facilement. En effet, tout le code pour faire un Drag and Drop et un Swipe tiens sur 12 lignes !
Le fichier MainActivity.java :
import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.DividerItemDecoration;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.helper.ItemTouchHelper;import java.util.ArrayList;import java.util.Collections;import java.util.List;publicclassMainActivityextendsAppCompatActivity{private RecyclerView recyclerView;private RecyclerView.LayoutManager layoutManager;private IngredientAdapter ingredientAdapter;@OverrideprotectedvoidonCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// On initialise notre liste de données
List<Ingredient> listeCourse =newArrayList<>();
listeCourse.add(newIngredient("Oranges","4"));
listeCourse.add(newIngredient("Tomates","2"));
listeCourse.add(newIngredient("Raisin","Une grappe"));
listeCourse.add(newIngredient("Pain","1/2"));
listeCourse.add(newIngredient("Banane","2 ou 3"));
listeCourse.add(newIngredient("Kiwi","2 ou 3"));
listeCourse.add(newIngredient("Pates","500g"));
listeCourse.add(newIngredient("Raviolis","Une boite"));
listeCourse.add(newIngredient("Fraises","500g"));
listeCourse.add(newIngredient("Glace","1L"));
listeCourse.add(newIngredient("Pizza","1"));
listeCourse.add(newIngredient("Yaourts","6"));
listeCourse.add(newIngredient("Riz","1kg"));
listeCourse.add(newIngredient("Haricots","500g"));// On récupère notre RecyclerView via son id
recyclerView =findViewById(R.id.ingredient_recyclerview);// On veut un RecyclerView qui utilise un LinearLayoutManager
layoutManager =newLinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);// On donne notre adapter à notre RecyclerView
ingredientAdapter =newIngredientAdapter(this, listeCourse);
recyclerView.setAdapter(ingredientAdapter);// On sépare chaque ligne de notre liste par un trait
DividerItemDecoration dividerItemDecoration =newDividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL);
recyclerView.addItemDecoration(dividerItemDecoration);// Drag and drop / Swipe
ItemTouchHelper.Callback itemToucherHelperCallback =newItemTouchHelper.Callback(){@OverridepublicintgetMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder){int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;returnmakeMovementFlags(dragFlags, swipeFlags);}@OverridepublicbooleanonMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target){
Collections.swap(ingredientAdapter.listeIngredient, viewHolder.getAdapterPosition(), target.getAdapterPosition());
ingredientAdapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());returntrue;}@OverridepublicvoidonSwiped(RecyclerView.ViewHolder viewHolder,int direction){int position = viewHolder.getAdapterPosition();
ingredientAdapter.listeIngredient.remove(position);
ingredientAdapter.notifyItemRemoved(position);}};
ItemTouchHelper itemTouchHelper =newItemTouchHelper(itemToucherHelperCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);}}