I am using ItemTouchHelper and ItemTouchHelper.SimpleCallback to allow the user to reorder a vertical list Recycler View.
The drag and drop works but the drop is forced after the first jumped line even though I don't leave up my finger from the dragged cell.
Please find below the SimpleCallback :
private void initSwipeAndDrap() {
ItemTouchHelper.SimpleCallback simpleItemTouchCallback =
new ItemTouchHelper.SimpleCallback(
ItemTouchHelper.UP | ItemTouchHelper.DOWN,
0) {
//========== Swipe (Not used) ==============
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
}
//========== Drag ==============
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
int fromPosition = viewHolder.getAdapterPosition();
int toPosition = target.getAdapterPosition();
Podcast podcast = rva.podcasts.remove(fromPosition);
rva.podcasts.add(toPosition, podcast);
act.dmo.updatePodcastsListPosition();
act.dmo.notifyDataSetChangedPodcast();
return true;
}
@Override
public boolean isLongPressDragEnabled() {
return false;
}
};
itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(rv);
}
Replacing notifyDataSetChanged() by notifyItemMoved() in onMove() method fixed my problem.
Which supprised me as I thought that onMove() was called after the drop. In fact, it has an effect on the drop itself.
For those having the snaping problem when you move an element, if you are using this override
@Override
public int getItemViewType(int position) {
return position;
}
Just delete it from your adapter and it will work just fine
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With