-
-
Notifications
You must be signed in to change notification settings - Fork 493
/
TouchEventHook.kt
30 lines (25 loc) · 1.49 KB
/
TouchEventHook.kt
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
package com.mikepenz.fastadapter.listeners
import android.view.MotionEvent
import android.view.View
import androidx.recyclerview.widget.RecyclerView
import com.mikepenz.fastadapter.FastAdapter
import com.mikepenz.fastadapter.GenericItem
abstract class TouchEventHook<Item : GenericItem> : EventHook<Item> {
abstract fun onTouch(v: View, event: MotionEvent, position: Int, fastAdapter: FastAdapter<Item>, item: Item): Boolean
}
/**
* Convenient extension function to simplify adding a [TouchEventHook] to the [FastAdapter]
*/
inline fun <reified VH : RecyclerView.ViewHolder, reified Item : GenericItem> FastAdapter<GenericItem>.addLongClickListener(crossinline resolveView: (VH) -> View?, crossinline resolveViews: ((VH) -> List<View>?) = { null }, crossinline onTouch: (v: View, event: MotionEvent, position: Int, fastAdapter: FastAdapter<Item>, item: Item) -> Boolean) {
addEventHook(object : TouchEventHook<Item>() {
override fun onBind(viewHolder: RecyclerView.ViewHolder): View? {
return if (viewHolder is VH) resolveView.invoke(viewHolder) else null
}
override fun onBindMany(viewHolder: RecyclerView.ViewHolder): List<View>? {
return if (viewHolder is VH) resolveViews.invoke(viewHolder) else super.onBindMany(viewHolder)
}
override fun onTouch(v: View, event: MotionEvent, position: Int, fastAdapter: FastAdapter<Item>, item: Item): Boolean {
return onTouch.invoke(v, event, position, fastAdapter, item)
}
})
}