You can implement the swipe-to-dismiss and drag-and-drop features with the RecyclerView without using 3rd party libraries.
Just use the [ItemTouchHelper](<https://developer.android.com/reference/android/support/v7/widget/helper/ItemTouchHelper.html>)
class included in the RecyclerView support library.
Instantiate the ItemTouchHelper
with the [SimpleCallback](<https://developer.android.com/reference/android/support/v7/widget/helper/ItemTouchHelper.SimpleCallback.html>)
callback and depending on which functionality you support, you should override onMove(RecyclerView, ViewHolder, ViewHolder)
and / or onSwiped(ViewHolder, int)
and and finally attach to your 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);
It’s worth mentioning that SimpleCallback
constructor applies the same swiping strategy to all items in the RecyclerView
. It’s possible in any case to update the default swiping direction for specific items by simply overriding method getSwipeDirs(RecyclerView, ViewHolder)
.
Let’s suppose for example that our RecyclerView
includes a HeaderViewHolder
and that we obviously don’t want to apply swiping to it. It will be enough to override getSwipeDirs
as follows:
@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);
}