@@ -10,12 +10,13 @@ import androidx.recyclerview.widget.RecyclerView
1010import androidx.viewbinding.ViewBinding
1111import com.issever.core.data.initialization.IsseverCore
1212
13- abstract class BaseAdapter <T : Any , VB : ViewBinding >(
13+ abstract class BaseAdapter <T : Any , VB : ViewBinding >(
1414 private val bindingInflater : (LayoutInflater , ViewGroup , Boolean ) -> VB
1515) : RecyclerView.Adapter<BaseAdapter<T, VB>.BaseViewHolder>() {
1616
1717 open val coreLocalData: BaseLocalData by lazy { IsseverCore .getBaseLocalData() }
18- inner class BaseViewHolder (val binding : VB ): RecyclerView.ViewHolder(binding.root)
18+
19+ inner class BaseViewHolder (val binding : VB ) : RecyclerView.ViewHolder(binding.root)
1920
2021 open val differ by lazy {
2122 AsyncListDiffer (this , object : DiffUtil .ItemCallback <T >() {
@@ -30,7 +31,10 @@ abstract class BaseAdapter<T: Any, VB: ViewBinding>(
3031 }
3132
3233 private var onItemViewClickListener: ((T , View ) -> Unit )? = null
34+ protected fun getViewClickListener (): ((T , View ) -> Unit )? = onItemViewClickListener
35+
3336 private var onItemClickListener: ((T ) -> Unit )? = null
37+ protected fun getClickListener (): ((T ) -> Unit )? = onItemClickListener
3438
3539 fun setOnItemViewClickListener (listener : (T , View ) -> Unit ) {
3640 onItemViewClickListener = listener
@@ -41,7 +45,10 @@ abstract class BaseAdapter<T: Any, VB: ViewBinding>(
4145 }
4246
4347 private var onItemViewLongClickListener: ((T , View ) -> Unit )? = null
48+ protected fun getViewLongClickListener (): ((T , View ) -> Unit )? = onItemViewLongClickListener
49+
4450 private var onItemLongClickListener: ((T ) -> Unit )? = null
51+ protected fun getLongClickListener (): ((T ) -> Unit )? = onItemLongClickListener
4552
4653 fun setOnItemViewLongClickListener (listener : (T , View ) -> Unit ) {
4754 onItemViewLongClickListener = listener
@@ -52,9 +59,13 @@ abstract class BaseAdapter<T: Any, VB: ViewBinding>(
5259 }
5360
5461 private var doubleClickTimeout: Long = 300L
62+ private var lastClickTime: Long = 0L
5563
5664 private var onItemViewDoubleClickListener: ((T , View ) -> Unit )? = null
65+ protected fun getViewDoubleClickListener (): ((T , View ) -> Unit )? = onItemViewDoubleClickListener
66+
5767 private var onItemDoubleClickListener: ((T ) -> Unit )? = null
68+ protected fun getDoubleClickListener (): ((T ) -> Unit )? = onItemDoubleClickListener
5869
5970 fun setOnItemViewDoubleClickListener (listener : (T , View ) -> Unit ) {
6071 onItemViewDoubleClickListener = listener
@@ -80,85 +91,74 @@ abstract class BaseAdapter<T: Any, VB: ViewBinding>(
8091
8192 override fun onBindViewHolder (holder : BaseViewHolder , position : Int ) {
8293 val item = getItem(position)
83- bind(holder, item,holder.binding.root.context)
94+ bind(holder, item, holder.binding.root.context)
8495
85- setClickListenerForView(item,holder.binding.root)
96+ setClickListenerForView(item, holder.binding.root)
8697 }
8798
99+ private val originalClickListeners = mutableMapOf<View , View .OnClickListener ?>()
100+
101+ private val originalLongClickListeners = mutableMapOf<View , View .OnLongClickListener ?>()
102+
88103 private fun setClickListenerForView (item : T , view : View ) {
89- var lastClickTime = 0L
90- var clickCount = 0
91-
92- val clickRunnable = Runnable {
93- if (clickCount == 1 ) {
94- onItemViewClickListener?.invoke(item, view)
95- onItemClickListener?.invoke(item)
96- } else if (clickCount == 2 ) {
97- onItemViewDoubleClickListener?.invoke(item, view)
98- onItemDoubleClickListener?.invoke(item)
104+ if (view.id != View .NO_ID || view.parent == null ) {
105+ if (! originalClickListeners.containsKey(view)) {
106+ originalClickListeners[view] = try {
107+ val field = View ::class .java.getDeclaredField(" mListenerInfo" )
108+ field.isAccessible = true
109+ val listenerInfo = field.get(view)
110+ val listenerField = listenerInfo.javaClass.getDeclaredField(" mOnClickListener" )
111+ listenerField.isAccessible = true
112+ listenerField.get(listenerInfo) as ? View .OnClickListener
113+ } catch (e: Exception ) {
114+ null
115+ }
99116 }
100- clickCount = 0
101- }
102117
103- val isDoubleClickEnabled = onItemViewDoubleClickListener != null || onItemDoubleClickListener != null
118+ if (! originalLongClickListeners.containsKey(view)) {
119+ originalLongClickListeners[view] = try {
120+ val field = View ::class .java.getDeclaredField(" mListenerInfo" )
121+ field.isAccessible = true
122+ val listenerInfo = field.get(view)
123+ val listenerField =
124+ listenerInfo.javaClass.getDeclaredField(" mOnLongClickListener" )
125+ listenerField.isAccessible = true
126+ listenerField.get(listenerInfo) as ? View .OnLongClickListener
127+ } catch (e: Exception ) {
128+ null
129+ }
130+ }
104131
105- if (view.parent == null ) {
106132 view.setOnClickListener {
107- if (isDoubleClickEnabled) {
108- val currentTime = System .currentTimeMillis()
109- if (currentTime - lastClickTime < doubleClickTimeout) {
110- clickCount++
111- view.removeCallbacks(clickRunnable)
112- } else {
113- clickCount = 1
114- }
115- lastClickTime = currentTime
116- view.postDelayed(clickRunnable, doubleClickTimeout)
133+ originalClickListeners[view]?.onClick(view)
134+
135+ val currentTime = System .currentTimeMillis()
136+ if (currentTime - lastClickTime < doubleClickTimeout) {
137+ onItemViewDoubleClickListener?.invoke(item, view)
138+ onItemDoubleClickListener?.invoke(item)
117139 } else {
118- onItemViewClickListener?.invoke(item, it )
140+ onItemViewClickListener?.invoke(item, view )
119141 onItemClickListener?.invoke(item)
120142 }
143+ lastClickTime = currentTime
121144 }
122145
123146 view.setOnLongClickListener {
124- onItemViewLongClickListener?.invoke(item, it)
147+ originalLongClickListeners[view]?.onLongClick(view)
148+ onItemViewLongClickListener?.invoke(item, view)
125149 onItemLongClickListener?.invoke(item)
126150 true
127151 }
128152 }
129153
130154 if (view is ViewGroup ) {
131155 for (i in 0 until view.childCount) {
132- val child = view.getChildAt(i)
133- setClickListenerForView(item, child)
134- }
135- } else {
136- view.setOnClickListener {
137- if (isDoubleClickEnabled) {
138- val currentTime = System .currentTimeMillis()
139- if (currentTime - lastClickTime < doubleClickTimeout) {
140- clickCount++
141- view.removeCallbacks(clickRunnable)
142- } else {
143- clickCount = 1
144- }
145- lastClickTime = currentTime
146- view.postDelayed(clickRunnable, doubleClickTimeout)
147- } else {
148- onItemViewClickListener?.invoke(item, it)
149- onItemClickListener?.invoke(item)
150- }
151- }
152-
153- view.setOnLongClickListener {
154- onItemViewLongClickListener?.invoke(item, it)
155- onItemLongClickListener?.invoke(item)
156- true
156+ setClickListenerForView(item, view.getChildAt(i))
157157 }
158158 }
159159 }
160160
161- abstract fun bind (holder : BaseViewHolder ,item : T , context : Context )
161+ abstract fun bind (holder : BaseViewHolder , item : T , context : Context )
162162
163163 open fun areItemsTheSame (oldItem : T , newItem : T ): Boolean {
164164 return oldItem == newItem
0 commit comments