mirror of
https://github.com/AdrianKuta/Unbound-Drag-Drop.git
synced 2025-04-20 06:59:02 +02:00
Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
ba299e915b | |||
a3439ee9cd | |||
f1cfc2a98a |
@ -27,7 +27,7 @@ To include Unbound Drag & Drop in your project, add the following dependency to
|
||||
file:
|
||||
|
||||
```kotlin
|
||||
implementation("dev.adriankuta:unbound-drag-drop:0.0.2")
|
||||
implementation("dev.adriankuta:unbound-drag-drop:0.1.0")
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
@ -7,7 +7,7 @@ plugins {
|
||||
|
||||
android {
|
||||
namespace = "dev.adriankuta.unbounddragdrop"
|
||||
version = "0.0.4"
|
||||
version = "0.1.0"
|
||||
|
||||
kotlinOptions {
|
||||
jvmTarget = JavaVersion.VERSION_17.toString()
|
||||
|
@ -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)
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,19 +1,19 @@
|
||||
[versions]
|
||||
androidGradlePlugin = "8.1.4"
|
||||
agp = "8.5.0"
|
||||
kotlin = "1.9.0"
|
||||
agp = "8.5.1"
|
||||
kotlin = "1.9.24"
|
||||
coreKtx = "1.13.1"
|
||||
junit = "4.13.2"
|
||||
junitVersion = "1.1.5"
|
||||
espressoCore = "3.5.1"
|
||||
junitVersion = "1.2.1"
|
||||
espressoCore = "3.6.1"
|
||||
appcompat = "1.7.0"
|
||||
kotlinxCoroutinesAndroid = "1.7.3"
|
||||
lifecycleViewmodelKtx = "2.8.2"
|
||||
lifecycleViewmodelKtx = "2.8.4"
|
||||
material = "1.12.0"
|
||||
activity = "1.9.0"
|
||||
activity = "1.9.1"
|
||||
constraintlayout = "2.1.4"
|
||||
timber = "5.0.1"
|
||||
unboundDragDrop = "0.0.1"
|
||||
unboundDragDrop = "0.1.0"
|
||||
|
||||
[libraries]
|
||||
android-tools-build-gradle-plugin = { group = "com.android.tools.build", name = "gradle", version.ref = "androidGradlePlugin" }
|
||||
|
Loading…
x
Reference in New Issue
Block a user