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.