admin
2020-07-10 5c4f2093beba360b53aba711108d8d407a93c585
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package com.wpc.library.recyclerviewhelper;
 
import android.graphics.Canvas;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.util.Log;
 
/**
 * 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;
    }
}