package com.wpc.library.util.MoveRecycleView; import android.graphics.Canvas; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.ItemTouchHelper; import android.util.Log; public class ItemTouchCallback extends ItemTouchHelper.Callback { private ItemTouchHelperAdapter mAdapter; public ItemTouchCallback(ItemTouchHelperAdapter adapter) { mAdapter = adapter; } @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { //int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; //允许上下的拖动 //int dragFlags =ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; //允许左右的拖动 //int swipeFlags = ItemTouchHelper.LEFT; //只允许从右向左侧滑 //int swipeFlags = ItemTouchHelper.DOWN; //只允许从上向下侧滑 //一般使用makeMovementFlags(int,int)或makeFlag(int, int)来构造我们的返回值 //makeMovementFlags(dragFlags, swipeFlags) int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; //允许上下左右的拖动 return makeMovementFlags(dragFlags, 0); } @Override public boolean isLongPressDragEnabled() { return true;//长按启用拖拽 } @Override public boolean isItemViewSwipeEnabled() { return false; //不启用拖拽删除 } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) { //通过接口传递拖拽交换数据的起始位置和目标位置的ViewHolder if (direction != 0) { mAdapter.onItemMove(source, target, direction); direction = 0; } return true; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { //移动删除回调,如果不用可以不用理 // mAdapter.onItemDissmiss(viewHolder); } @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { super.onSelectedChanged(viewHolder, actionState); if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { //当滑动或者拖拽view的时候通过接口返回该ViewHolder mAdapter.onItemSelect(viewHolder); } } @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); if (!recyclerView.isComputingLayout()) { //当需要清除之前在onSelectedChanged或者onChildDraw,onChildDrawOver设置的状态或者动画时通过接口返回该ViewHolder mAdapter.onItemClear(viewHolder); } } int direction = 0;//1、上拉;2、下滑;3、左滑;4、右滑 float itemWidth = 0; float itemHeight = 0; @Override public void onChildDrawOver(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { super.onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); int fromPosition = viewHolder.getAdapterPosition(); if (itemWidth == 0) { //获取单个Item宽度 itemWidth = recyclerView.getChildAt(fromPosition).getMeasuredWidth() / 2; } if (itemHeight == 0) { //获取单个Item高度 itemHeight = recyclerView.getChildAt(fromPosition).getMeasuredHeight() / 2; } Log.e("mResult", "scrollX:" + itemWidth + "---scrollY:" + itemHeight); if (dX < 0 && Math.abs(dX) >= itemWidth) { direction = 3; } else if (dX > 0 && Math.abs(dX) >= itemWidth) { direction = 4; } else if (dY < 0 && Math.abs(dY) >= itemHeight) { direction = 1; } else if (dY > 0 && Math.abs(dY) >= itemHeight) { direction = 2; } else { direction = 0; } if (Math.abs(dX) >= itemWidth || Math.abs(dY) >= itemHeight) { onMove(recyclerView, viewHolder, viewHolder); } } }