Faites glisser et déposer des éléments dans RecyclerView avec GridLayoutManager

Ce que je veux réaliser:
Avoir un RecyclerView avec GridLayoutManager qui supporte le glisser-déposer et qui réorganise les éléments en les faisant glisser.

Note de côté: d'Abord le temps de développer quelque chose avec un glisser-déposer.

Il y a beaucoup de sujets sur la façon de réaliser cette fonctionnalité à l'aide d'une Liste, par exemple: https://raw.githubusercontent.com/btownrippleman/FurthestProgress/master/FurthestProgress/src/com/anappforthat/android/languagelineup/DynamicListView.java

Cependant, les exemples sont habituellement beaucoup de code avec, la création d'images de l'traîné point de vue et il se sent comme il devrait être possible d'atteindre le même résultat à l'aide de View.startDrag(...) et RecyclerView avec notifyItemAdded(), notifyItemMoved() et notifyItemRemoved() car ils fournissent à réorganiser les animations.

Donc j'ai joué autour de certains et est venu avec cette:

final CardAdapter adapter = new CardAdapter(list);
adapter.setHasStableIds(true);
adapter.setListener(new CardAdapter.OnLongClickListener() {
@Override
public void onLongClick(View view) {
ClipData data = ClipData.newPlainText("","");
View.DragShadowBuilder builder = new View.DragShadowBuilder(view);
final int pos = mRecyclerView.getChildAdapterPosition(view);
final Goal item = list.remove(pos);
mRecyclerView.setOnDragListener(new View.OnDragListener() {
int prevPos = pos;
@Override
public boolean onDrag(View view, DragEvent dragEvent) {
final int action = dragEvent.getAction();
switch(action) {
case DragEvent.ACTION_DRAG_LOCATION:
View onTopOf = mRecyclerView.findChildViewUnder(dragEvent.getX(), dragEvent.getY());
int i = mRecyclerView.getChildAdapterPosition(onTopOf);
list.add(i, list.remove(prevPos));
adapter.notifyItemMoved(prevPos, i);
prevPos = i;
break;
case DragEvent.ACTION_DROP:
View underView = mRecyclerView.findChildViewUnder(dragEvent.getX(), dragEvent.getY());
int underPos = mRecyclerView.getChildAdapterPosition(underView);
list.add(underPos, item);
adapter.notifyItemInserted(underPos);
adapter.notifyDataSetChanged();
break;
}
return true;
}
});
view.startDrag(data, builder, view, 0);
}
});
mRecyclerView.setAdapter(adapter);

Ce morceau de code genre de travail, j'ai l'échangisme, mais très instable/fragile et parfois, quand c'est l'actualisation de l'ensemble de la grille est réarrangé à l'origine de l'ordre ou à quelque chose d'aléatoire. De toute façon le code ci-dessus est juste mon premier rapide tentative, ce que je suis vraiment plus intéressé à en savoir est s'il y a une norme sur les pratiques exemplaires façon de faire du glisser-déposer avec ReyclerView ou si la bonne façon de le résoudre est toujours le même qui a été utilisé pour les ListViews pendant des années?