package com.wpc.library.recyclerviewhelper;
|
|
import android.graphics.Canvas;
|
import androidx.recyclerview.widget.GridLayoutManager;
|
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
|
import androidx.recyclerview.widget.ItemTouchHelper;
|
|
/**
|
* ItemDragHelperCallback
|
* Created by YoKeyword on 15/12/29.
|
*/
|
public class ItemDragHelperCallback extends ItemTouchHelper.Callback {
|
|
private int noMovePosition;
|
|
public ItemDragHelperCallback(int noMovePosition) {
|
this.noMovePosition = noMovePosition;
|
}
|
|
@Override
|
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
|
int fromPosition = viewHolder.getAdapterPosition();
|
if (fromPosition < noMovePosition)
|
return 0;
|
int dragFlags;
|
RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
|
if (manager instanceof GridLayoutManager || manager instanceof StaggeredGridLayoutManager) {
|
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
|
} else {
|
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
|
}
|
// 如果想支持滑动(删除)操作, swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END
|
int swipeFlags = 0;
|
return makeMovementFlags(dragFlags, swipeFlags);
|
}
|
|
@Override
|
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
|
// 不同Type之间不可移动
|
if (viewHolder.getItemViewType() != target.getItemViewType()) {
|
return false;
|
}
|
|
if (recyclerView.getAdapter() instanceof OnItemMoveListener && direction != 0) {
|
OnItemMoveListener listener = ((OnItemMoveListener) recyclerView.getAdapter());
|
listener.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition(), direction);
|
direction = 0;
|
}
|
return true;
|
}
|
|
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);
|
}
|
|
}
|
|
@Override
|
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
|
|
}
|
|
@Override
|
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
|
// 不在闲置状态
|
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
|
if (viewHolder instanceof OnDragVHListener) {
|
OnDragVHListener itemViewHolder = (OnDragVHListener) viewHolder;
|
itemViewHolder.onItemSelected();
|
}
|
}
|
super.onSelectedChanged(viewHolder, actionState);
|
}
|
|
@Override
|
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
|
if (viewHolder instanceof OnDragVHListener) {
|
OnDragVHListener itemViewHolder = (OnDragVHListener) viewHolder;
|
itemViewHolder.onItemFinish();
|
}
|
super.clearView(recyclerView, viewHolder);
|
}
|
|
@Override
|
public boolean isLongPressDragEnabled() {
|
// 不支持长按拖拽功能 手动控制
|
return false;
|
}
|
|
@Override
|
public boolean isItemViewSwipeEnabled() {
|
// 不支持滑动功能
|
return false;
|
}
|
}
|