+ itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
+ @Override
+ public float getMoveThreshold(@NonNull RecyclerView.ViewHolder viewHolder) {
+ return 0.1f;
+ }
+ @Override
+ public boolean isLongPressDragEnabled() {
+ return false;
+ }
+ @Override
+ public RecyclerView.ViewHolder chooseDropTarget(
+ @NonNull RecyclerView.ViewHolder selected,
+ @NonNull List<RecyclerView.ViewHolder> dropTargets, int curX, int curY) {
+ RecyclerView.ViewHolder best = null;
+ int bestDistance = 0;
+ for (RecyclerView.ViewHolder v : dropTargets) {
+ if (v == selected)
+ continue;
+
+ final int viewTop = v.itemView.getTop();
+ int distance = Math.abs(viewTop - curY);
+ if (best == null) {
+ best = v;
+ bestDistance = distance;
+ }
+ else {
+ if (distance < bestDistance) {
+ bestDistance = distance;
+ best = v;
+ }
+ }
+ }
+
+ Logger.debug("dnd", "Best target is " + best);
+ return best;
+ }
+ @Override
+ public boolean canDropOver(@NonNull RecyclerView recyclerView,
+ @NonNull RecyclerView.ViewHolder current,
+ @NonNull RecyclerView.ViewHolder target) {
+ final int adapterPosition = target.getAdapterPosition();
+
+ // first item is immovable
+ if (adapterPosition == 0)
+ return false;
+
+ return super.canDropOver(recyclerView, current, target);
+ }
+ @Override
+ public int getMovementFlags(@NonNull RecyclerView recyclerView,
+ @NonNull RecyclerView.ViewHolder viewHolder) {
+ int flags = 0;
+ // the top item (transaction params) is always there
+ final int adapterPosition = viewHolder.getAdapterPosition();
+ if (adapterPosition > 0)
+ flags |= makeFlag(ItemTouchHelper.ACTION_STATE_DRAG,
+ ItemTouchHelper.UP | ItemTouchHelper.DOWN) |
+ makeFlag(ItemTouchHelper.ACTION_STATE_SWIPE,
+ ItemTouchHelper.START | ItemTouchHelper.END);
+
+ return flags;
+ }
+ @Override
+ public boolean onMove(@NonNull RecyclerView recyclerView,
+ @NonNull RecyclerView.ViewHolder viewHolder,
+ @NonNull RecyclerView.ViewHolder target) {
+
+ final int fromPosition = viewHolder.getAdapterPosition();
+ final int toPosition = target.getAdapterPosition();
+ mModel.moveItem(fromPosition, toPosition);
+
+ return true;
+ }
+ @Override
+ public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
+ int pos = viewHolder.getAdapterPosition();
+ mModel.removeItem(pos);
+ }
+ });
+ }
+ @Override
+ public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
+ super.onAttachedToRecyclerView(recyclerView);
+
+ itemTouchHelper.attachToRecyclerView(recyclerView);
+ }
+ @Override
+ public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) {
+ super.onDetachedFromRecyclerView(recyclerView);
+
+ itemTouchHelper.attachToRecyclerView(null);