mirror of
				https://github.com/AdrianKuta/Unbound-Drag-Drop.git
				synced 2025-10-31 00:13:39 +01:00 
			
		
		
		
	| @@ -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) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 GitHub
						GitHub