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