1
+ package me.yifeiyuan.flap.ext
2
+
3
+ import android.graphics.Canvas
4
+ import android.util.Log
5
+ import androidx.recyclerview.widget.*
6
+ import me.yifeiyuan.flap.FlapDebug
7
+
8
+ /* *
9
+ *
10
+ * 封装处理 滑动删除 和 长按拖放排序 功能
11
+ *
12
+ * Created by 程序亦非猿 on 2022/8/17.
13
+ *
14
+ * @since 3.0.6
15
+ */
16
+ class SwipeDragHelper (private val callback : Callback ) : ItemTouchHelper.Callback() {
17
+
18
+ /* *
19
+ * 拖动是否可用
20
+ */
21
+ var isDragEnable = true
22
+
23
+ /* *
24
+ * 滑动删除是否可用
25
+ */
26
+ var isSwipeEnable = true
27
+
28
+ var dragFlags = - 1
29
+ var swipeFlags = - 1
30
+
31
+ var swipeThreshold = 0.5f
32
+ var dragThreshold = 0.5f
33
+
34
+ private var onMove: ((fromPosition: Int , toPosition: Int ) -> Unit )? = null
35
+ private var onDismiss: ((position: Int ) -> Unit )? = null
36
+
37
+ private val itemTouchHelper: ItemTouchHelper = ItemTouchHelper (this )
38
+
39
+ override fun isLongPressDragEnabled (): Boolean {
40
+ return isDragEnable
41
+ }
42
+
43
+ override fun isItemViewSwipeEnabled (): Boolean {
44
+ return isSwipeEnable
45
+ }
46
+
47
+ override fun getMovementFlags (recyclerView : RecyclerView , viewHolder : RecyclerView .ViewHolder ): Int {
48
+ val finalDragFlags = if (dragFlags != - 1 ) dragFlags else genDefaultDragFlags(recyclerView, viewHolder)
49
+ val finalSwipeFlags = if (swipeFlags != - 1 ) swipeFlags else genDefaultSwipeFlags(recyclerView, viewHolder)
50
+ return makeMovementFlags(finalDragFlags, finalSwipeFlags)
51
+ }
52
+
53
+ private fun genDefaultDragFlags (recyclerView : RecyclerView , viewHolder : RecyclerView .ViewHolder ): Int {
54
+ return when (recyclerView.layoutManager) {
55
+ is StaggeredGridLayoutManager -> {
56
+ ItemTouchHelper .UP or ItemTouchHelper .DOWN or ItemTouchHelper .LEFT or ItemTouchHelper .RIGHT
57
+ }
58
+ is GridLayoutManager -> {
59
+ ItemTouchHelper .UP or ItemTouchHelper .DOWN or ItemTouchHelper .LEFT or ItemTouchHelper .RIGHT
60
+ }
61
+ is LinearLayoutManager -> {
62
+ ItemTouchHelper .UP or ItemTouchHelper .DOWN
63
+ }
64
+ else -> {
65
+ ItemTouchHelper .UP or ItemTouchHelper .DOWN
66
+ }
67
+ }
68
+ }
69
+
70
+ private fun genDefaultSwipeFlags (recyclerView : RecyclerView , viewHolder : RecyclerView .ViewHolder ): Int {
71
+ return when (recyclerView.layoutManager) {
72
+ is StaggeredGridLayoutManager -> {
73
+ ItemTouchHelper .UP or ItemTouchHelper .DOWN or ItemTouchHelper .LEFT or ItemTouchHelper .RIGHT
74
+ }
75
+ is GridLayoutManager -> {
76
+ ItemTouchHelper .UP or ItemTouchHelper .DOWN or ItemTouchHelper .LEFT or ItemTouchHelper .RIGHT
77
+ }
78
+ is LinearLayoutManager -> {
79
+ ItemTouchHelper .START or ItemTouchHelper .END
80
+ }
81
+ else -> {
82
+ ItemTouchHelper .START or ItemTouchHelper .END
83
+ }
84
+ }
85
+ }
86
+
87
+ override fun onMove (recyclerView : RecyclerView , viewHolder : RecyclerView .ViewHolder , target : RecyclerView .ViewHolder ): Boolean {
88
+ if (viewHolder.itemViewType == target.itemViewType) {
89
+ onMove?.invoke(viewHolder.adapterPosition, target.adapterPosition)
90
+ return true
91
+ }
92
+ return false
93
+ }
94
+
95
+ fun doOnMove (block : (fromPosition: Int , toPosition: Int ) -> Unit ) {
96
+ onMove = block
97
+ }
98
+
99
+ // Item 被滑动删除了调用
100
+ override fun onSwiped (viewHolder : RecyclerView .ViewHolder , direction : Int ) {
101
+ onDismiss?.invoke(viewHolder.adapterPosition)
102
+ callback.onItemDismiss(viewHolder.adapterPosition)
103
+ }
104
+
105
+ fun doOnDismiss (block : (position: Int ) -> Unit ) {
106
+ onDismiss = block
107
+ }
108
+
109
+ fun attachToRecyclerView (recyclerView : RecyclerView ) {
110
+ itemTouchHelper.attachToRecyclerView(recyclerView)
111
+ }
112
+
113
+ override fun onSelectedChanged (viewHolder : RecyclerView .ViewHolder ? , actionState : Int ) {
114
+ super .onSelectedChanged(viewHolder, actionState)
115
+ }
116
+
117
+ override fun getSwipeThreshold (viewHolder : RecyclerView .ViewHolder ): Float {
118
+ return swipeThreshold
119
+ }
120
+
121
+ override fun getMoveThreshold (viewHolder : RecyclerView .ViewHolder ): Float {
122
+ return dragThreshold
123
+ }
124
+
125
+ /* *
126
+ * onMove return true 后会调用
127
+ */
128
+ override fun onMoved (recyclerView : RecyclerView , viewHolder : RecyclerView .ViewHolder , fromPos : Int , target : RecyclerView .ViewHolder , toPos : Int , x : Int , y : Int ) {
129
+ super .onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y)
130
+ callback.onItemMoved(fromPos, toPos)
131
+ }
132
+
133
+ /* *
134
+ * 当用户交互完成后调用,此时动画也结束了,例如滑动删除后、拖放完毕
135
+ * 在 onViewDetachedFromWindow 之后
136
+ */
137
+ override fun clearView (recyclerView : RecyclerView , viewHolder : RecyclerView .ViewHolder ) {
138
+ super .clearView(recyclerView, viewHolder)
139
+ }
140
+
141
+ override fun onChildDraw (c : Canvas , recyclerView : RecyclerView , viewHolder : RecyclerView .ViewHolder , dX : Float , dY : Float , actionState : Int , isCurrentlyActive : Boolean ) {
142
+ super .onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
143
+ }
144
+
145
+ override fun onChildDrawOver (c : Canvas , recyclerView : RecyclerView , viewHolder : RecyclerView .ViewHolder ? , dX : Float , dY : Float , actionState : Int , isCurrentlyActive : Boolean ) {
146
+ super .onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
147
+ }
148
+
149
+ interface Callback {
150
+ fun onItemDismiss (position : Int )
151
+ fun onItemMoved (fromPosition : Int , toPosition : Int )
152
+ }
153
+ }
0 commit comments