完整代碼以下所示/**
* <pre>
* @author 楊充
* blog : https://github.com/yangchong211
* time : 2017/5/2
* desc : 自定義ItemTouchHelper
* revise: 參考嚴正傑大神博客:https://blog.csdn.net/yanzhenjie1003/article/details/51935982
* </pre>
*/
public class ItemTouchHelpCallback extends ItemTouchHelper.Callback {
/**
* Item操做的回調,去更新UI和數據源
*/
private OnItemTouchCallbackListener onItemTouchCallbackListener;
/**
* 是否能夠拖拽
*/
private boolean isCanDrag = false;
/**
* 是否能夠被滑動
*/
private boolean isCanSwipe = false;
/**
* 按住拖動item的顏色
*/
private int color = 0;
public ItemTouchHelpCallback(OnItemTouchCallbackListener onItemTouchCallbackListener) {
this.onItemTouchCallbackListener = onItemTouchCallbackListener;
}
/**
* 設置是否能夠被拖拽
*
* @param canDrag 是true,否false
*/
public void setDragEnable(boolean canDrag) {
isCanDrag = canDrag;
}
/**
* 設置是否能夠被滑動
*
* @param canSwipe 是true,否false
*/
public void setSwipeEnable(boolean canSwipe) {
isCanSwipe = canSwipe;
}
/**
* 設置按住拖動item的顏色
* @param color 顏色
*/
public void setColor(@ColorInt int color){
this.color = color;
}
/**
* 當Item被長按的時候是否能夠被拖拽
*
* @return true
*/
@Override
public boolean isLongPressDragEnabled() {
return isCanDrag;
}
/**
* Item是否能夠被滑動(H:左右滑動,V:上下滑動)
* isItemViewSwipeEnabled()返回值是否能夠拖拽排序,true能夠,false不能夠
* @return true
*/
@Override
public boolean isItemViewSwipeEnabled() {
return isCanSwipe;
}
/**
* 當用戶拖拽或者滑動Item的時候須要咱們告訴系統滑動或者拖拽的方向
* 動做標識分:dragFlags和swipeFlags
* dragFlags:列表滾動方向的動做標識(如豎直列表就是上和下,水平列表就是左和右)
* wipeFlags:與列表滾動方向垂直的動做標識(如豎直列表就是左和右,水平列表就是上和下)
*
* 思路:若是你不想上下拖動,能夠將 dragFlags = 0
* 若是你不想左右滑動,能夠將 swipeFlags = 0
* 最終的動做標識(flags)必需要用makeMovementFlags()方法生成
*/
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView,
@NonNull RecyclerView.ViewHolder viewHolder) {
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof GridLayoutManager) {
// flag若是值是0,至關於這個功能被關閉
int dragFlag = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT
| ItemTouchHelper.UP | ItemTouchHelper.DOWN;
int swipeFlag = 0;
// create make
return makeMovementFlags(dragFlag, swipeFlag);
} else if (layoutManager instanceof LinearLayoutManager) {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
int orientation = linearLayoutManager.getOrientation();
int dragFlag = 0;
int swipeFlag = 0;
// 爲了方便理解,至關於分爲橫着的ListView和豎着的ListView
// 若是是橫向的佈局
if (orientation == LinearLayoutManager.HORIZONTAL) {
swipeFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
dragFlag = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
} else if (orientation == LinearLayoutManager.VERTICAL) {
// 若是是豎向的佈局,至關於ListView
dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
swipeFlag = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
}
//第一個參數是拖拽flag,第二個是滑動的flag
return makeMovementFlags(dragFlag, swipeFlag);
}
return 0;
}
/**
* 當Item被拖拽的時候被回調
*
* @param recyclerView recyclerView
* @param srcViewHolder 當前被拖拽的item的viewHolder
* @param targetViewHolder 當前被拖拽的item下方的另外一個item的viewHolder
* @return 是否被移動
*/
@Override
public boolean onMove(@NonNull RecyclerView recyclerView,
@NonNull RecyclerView.ViewHolder srcViewHolder,
@NonNull RecyclerView.ViewHolder targetViewHolder) {
if (onItemTouchCallbackListener != null) {
int srcPosition = srcViewHolder.getAdapterPosition();
int targetPosition = targetViewHolder.getAdapterPosition();
return onItemTouchCallbackListener.onMove(srcPosition, targetPosition);
}
return false;
}
/**
* 當item側滑出去時觸發(豎直列表是側滑,水平列表是豎滑)
*
* @param viewHolder viewHolder
* @param direction 滑動的方向
*/
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
if (onItemTouchCallbackListener != null) {
onItemTouchCallbackListener.onSwiped(viewHolder.getAdapterPosition());
}
}
/**
* 當item被拖拽或側滑時觸發
*
* @param viewHolder viewHolder
* @param actionState 當前item的狀態
*/
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
//不論是拖拽或是側滑,背景色都要變化
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
if (color==0){
viewHolder.itemView.setBackgroundColor(viewHolder.itemView.getContext()
.getResources().getColor(android.R.color.darker_gray));
}else {
viewHolder.itemView.setBackgroundColor(color);
}
}
}
/**
* 當item的交互動畫結束時觸發
*
* @param recyclerView recyclerView
* @param viewHolder viewHolder
*/
@Override
public void clearView(@NonNull RecyclerView recyclerView,
@NonNull RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
viewHolder.itemView.setBackgroundColor(viewHolder.itemView.getContext().getResources()
.getColor(android.R.color.white));
viewHolder.itemView.setAlpha(1);
viewHolder.itemView.setScaleY(1);
}
@Override
public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView,
@NonNull RecyclerView.ViewHolder viewHolder,
float dX, float dY, int actionState, boolean isCurrentlyActive) {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
float value = 1 - Math.abs(dX) / viewHolder.itemView.getWidth();
viewHolder.itemView.setAlpha(value);
viewHolder.itemView.setScaleY(value);
}
}
public interface OnItemTouchCallbackListener {
/**
* 當某個Item被滑動刪除的時候
*
* @param adapterPosition item的position
*/
void onSwiped(int adapterPosition);
/**
* 當兩個Item位置互換的時候被回調
*
* @param srcPosition 拖拽的item的position
* @param targetPosition 目的地的Item的position
* @return 開發者處理了操做應該返回true,開發者沒有處理就返回false
*/
boolean onMove(int srcPosition, int targetPosition);
}
}
複製代碼