#2 Support attaching multiple RecyclerView (#3)

This commit is contained in:
Adrian Kuta 2024-07-30 10:53:41 +02:00 committed by GitHub
parent cc5cc07f4a
commit f1cfc2a98a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -6,15 +6,15 @@ import android.view.View
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.DRAG_FLAG_OPAQUE import androidx.recyclerview.widget.RecyclerView.DRAG_FLAG_OPAQUE
import androidx.recyclerview.widget.RecyclerView.ViewHolder import androidx.recyclerview.widget.RecyclerView.ViewHolder
/** /**
* Helper class to handle drag and drop functionality in a RecyclerView. * Helper class to handle drag and drop functionality in multiple RecyclerViews.
* *
* @param callback A Callback object to handle the drag and drop events. * @param callback A Callback object to handle the drag and drop events.
*/ */
class DragDropHelper(callback: Callback) : class DragDropHelper(private val callback: Callback) : RecyclerView.OnChildAttachStateChangeListener {
RecyclerView.OnChildAttachStateChangeListener { private val recyclerViews = mutableListOf<RecyclerView>()
private var mRecyclerView: RecyclerView? = null private val recyclerItemClickListeners = mutableMapOf<RecyclerView, RecyclerItemClickListener>()
private var recyclerItemClickListener: RecyclerItemClickListener? = null
private val dropListener = DropListener(callback) private val dropListener = DropListener(callback)
private val onItemLongClickListener: RecyclerItemClickListener.OnItemLongClickListener by lazy { private val onItemLongClickListener: RecyclerItemClickListener.OnItemLongClickListener by lazy {
object : RecyclerItemClickListener.OnItemLongClickListener { object : RecyclerItemClickListener.OnItemLongClickListener {
@ -39,30 +39,42 @@ class DragDropHelper(callback: Callback) :
* @param recyclerView The RecyclerView to attach to. * @param recyclerView The RecyclerView to attach to.
*/ */
fun attachToRecyclerView(recyclerView: RecyclerView?) { fun attachToRecyclerView(recyclerView: RecyclerView?) {
if (mRecyclerView === recyclerView) { recyclerView?.let {
return // nothing to do if (recyclerViews.contains(it)) return // already attached
recyclerViews.add(it)
setupCallbacks(it)
} }
if (mRecyclerView != null) { }
destroyCallbacks()
} /**
mRecyclerView = recyclerView * Detaches the DragDropHelper from the specified RecyclerView.
mRecyclerView?.let { *
setupCallbacks() * @param recyclerView The RecyclerView to detach from.
*/
fun detachFromRecyclerView(recyclerView: RecyclerView?) {
recyclerView?.let {
if (!recyclerViews.contains(it)) return // not attached
destroyCallbacks(it)
recyclerViews.remove(it)
} }
} }
/** /**
* Sets up the necessary callbacks for the RecyclerView. * Sets up the necessary callbacks for the RecyclerView.
*
* @param recyclerView The RecyclerView to setup callbacks for.
*/ */
private fun setupCallbacks() { private fun setupCallbacks(recyclerView: RecyclerView) {
mRecyclerView?.apply { recyclerView.apply {
recyclerItemClickListener = RecyclerItemClickListener( val clickListener = RecyclerItemClickListener(
context, context,
this, this,
onItemLongClickListener onItemLongClickListener
).also { )
mRecyclerView?.addOnItemTouchListener(it) recyclerItemClickListeners[this] = clickListener
} addOnItemTouchListener(clickListener)
addOnChildAttachStateChangeListener(this@DragDropHelper) addOnChildAttachStateChangeListener(this@DragDropHelper)
setOnDragListener(dropListener) setOnDragListener(dropListener)
} }
@ -70,13 +82,16 @@ class DragDropHelper(callback: Callback) :
/** /**
* Removes the callbacks from the RecyclerView. * Removes the callbacks from the RecyclerView.
*
* @param recyclerView The RecyclerView to remove callbacks from.
*/ */
private fun destroyCallbacks() { private fun destroyCallbacks(recyclerView: RecyclerView) {
recyclerItemClickListener?.let { recyclerItemClickListeners[recyclerView]?.let {
mRecyclerView?.removeOnItemTouchListener(it) recyclerView.removeOnItemTouchListener(it)
recyclerItemClickListeners.remove(recyclerView)
} }
mRecyclerView?.removeOnChildAttachStateChangeListener(this) recyclerView.removeOnChildAttachStateChangeListener(this)
mRecyclerView?.setOnDragListener(null) recyclerView.setOnDragListener(null)
} }
/** /**