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);
|
}
|
|
}
|
}
|