Что я хочу достичь: Имейте RecyclerView с GridLayoutManager, который поддерживает drag'n'drop, и это переупорядочивает элементы при перетаскивании.Перетаскивание элементов в RecyclerView с помощью GridLayoutManager
Сторона примечания: Впервые развивается что-либо с перетаскиванием.
Есть много тем о том, как достичь этой функции с помощью ListView, например: https://raw.githubusercontent.com/btownrippleman/FurthestProgress/master/FurthestProgress/src/com/anappforthat/android/languagelineup/DynamicListView.java
Однако примеры, как правило, много кода с, создавая битовые карты перемещенного зрения, и он чувствует, как он должен быть достигнут тот же результат с использованием View.startDrag(...)
и RecyclerView с notifyItemAdded()
, notifyItemMoved()
и notifyItemRemoved()
, поскольку они обеспечивают перегруппировку анимаций.
Так что я играл некоторые и придумал это:
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);
Этот кусок кода вида работы, я получаю обменивать, но очень нестабильно/шатким, а иногда, когда он освежает всю сетку перестраивается назад к первоначальному заказу или к чему-то случайному. В любом случае, приведенный выше код - это только моя первая быстрая попытка, и я больше заинтересован в том, чтобы знать, есть ли какой-то стандарт/лучший способ сделать перетаскивание с помощью ReyclerView или если правильный способ его решения по-прежнему остается тем же, что и были использованы для ListViews в течение многих лет?
Интересно, исследуем это решение в понедельник, но оно кажется многообещающим. –
@PaulBurke: Я обновил код, но оригинальная идея состояла в том, чтобы дать обзор метода и оставить подробности в документации – stan0
@ stan0 Up-voted. Надеемся, что OP примет ответ сейчас (что он завершен). –