私が達成したいこと:ドラッグアンドドロップをサポートし、ドラッグ中にアイテムを再配置するGridLayoutManagerを備えたRecyclerViewを用意します。
補足: ドラッグ アンド ドロップで何かを開発するのは初めてです。
たとえば、ListView を使用してこの機能を実現する方法については、多くのトピックがあります。
ただし、例は通常、ドラッグされたビューのビットマップを作成する多くのコードであり、アニメーションを再配置するため、 RecyclerViewと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 に何年も使用されていますか?