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.DRAG_FLAG_OPAQUE | ||||
| 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. | ||||
|  */ | ||||
| class DragDropHelper(callback: Callback) : | ||||
|     RecyclerView.OnChildAttachStateChangeListener { | ||||
|     private var mRecyclerView: RecyclerView? = null | ||||
|     private var recyclerItemClickListener: RecyclerItemClickListener? = null | ||||
| class DragDropHelper(private val callback: Callback) : RecyclerView.OnChildAttachStateChangeListener { | ||||
|     private val recyclerViews = mutableListOf<RecyclerView>() | ||||
|     private val recyclerItemClickListeners = mutableMapOf<RecyclerView, RecyclerItemClickListener>() | ||||
|     private val dropListener = DropListener(callback) | ||||
|     private val onItemLongClickListener: RecyclerItemClickListener.OnItemLongClickListener by lazy { | ||||
|         object : RecyclerItemClickListener.OnItemLongClickListener { | ||||
| @@ -39,30 +39,42 @@ class DragDropHelper(callback: Callback) : | ||||
|      * @param recyclerView The RecyclerView to attach to. | ||||
|      */ | ||||
|     fun attachToRecyclerView(recyclerView: RecyclerView?) { | ||||
|         if (mRecyclerView === recyclerView) { | ||||
|             return  // nothing to do | ||||
|         recyclerView?.let { | ||||
|             if (recyclerViews.contains(it)) return  // already attached | ||||
|  | ||||
|             recyclerViews.add(it) | ||||
|             setupCallbacks(it) | ||||
|         } | ||||
|         if (mRecyclerView != null) { | ||||
|             destroyCallbacks() | ||||
|         } | ||||
|         mRecyclerView = recyclerView | ||||
|         mRecyclerView?.let { | ||||
|             setupCallbacks() | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Detaches the DragDropHelper from the specified RecyclerView. | ||||
|      * | ||||
|      * @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. | ||||
|      * | ||||
|      * @param recyclerView The RecyclerView to setup callbacks for. | ||||
|      */ | ||||
|     private fun setupCallbacks() { | ||||
|         mRecyclerView?.apply { | ||||
|             recyclerItemClickListener = RecyclerItemClickListener( | ||||
|     private fun setupCallbacks(recyclerView: RecyclerView) { | ||||
|         recyclerView.apply { | ||||
|             val clickListener = RecyclerItemClickListener( | ||||
|                 context, | ||||
|                 this, | ||||
|                 onItemLongClickListener | ||||
|             ).also { | ||||
|                 mRecyclerView?.addOnItemTouchListener(it) | ||||
|             } | ||||
|             ) | ||||
|             recyclerItemClickListeners[this] = clickListener | ||||
|             addOnItemTouchListener(clickListener) | ||||
|             addOnChildAttachStateChangeListener(this@DragDropHelper) | ||||
|             setOnDragListener(dropListener) | ||||
|         } | ||||
| @@ -70,13 +82,16 @@ class DragDropHelper(callback: Callback) : | ||||
|  | ||||
|     /** | ||||
|      * Removes the callbacks from the RecyclerView. | ||||
|      * | ||||
|      * @param recyclerView The RecyclerView to remove callbacks from. | ||||
|      */ | ||||
|     private fun destroyCallbacks() { | ||||
|         recyclerItemClickListener?.let { | ||||
|             mRecyclerView?.removeOnItemTouchListener(it) | ||||
|     private fun destroyCallbacks(recyclerView: RecyclerView) { | ||||
|         recyclerItemClickListeners[recyclerView]?.let { | ||||
|             recyclerView.removeOnItemTouchListener(it) | ||||
|             recyclerItemClickListeners.remove(recyclerView) | ||||
|         } | ||||
|         mRecyclerView?.removeOnChildAttachStateChangeListener(this) | ||||
|         mRecyclerView?.setOnDragListener(null) | ||||
|         recyclerView.removeOnChildAttachStateChangeListener(this) | ||||
|         recyclerView.setOnDragListener(null) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -133,4 +148,4 @@ class DragDropHelper(callback: Callback) : | ||||
|             targetViewHolder: ViewHolder? | ||||
|         ) | ||||
|     } | ||||
| } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 GitHub
						GitHub