Compare commits

..

5 Commits

Author SHA1 Message Date
ba299e915b
Update README.md 2024-12-16 15:22:35 +01:00
a3439ee9cd Update lib versions 2024-07-30 10:56:04 +02:00
f1cfc2a98a
#2 Support attaching multiple RecyclerView (#3) 2024-07-30 10:53:41 +02:00
cc5cc07f4a Disable automatic release 2024-07-30 10:30:08 +02:00
e42b32142b Remove onPush trigger 2024-07-29 22:37:48 +02:00
5 changed files with 50 additions and 36 deletions

View File

@ -1,7 +1,6 @@
name: Publish name: Publish
on: on:
push:
release: release:
# We'll run this workflow when a new GitHub release is created # We'll run this workflow when a new GitHub release is created
types: [released] types: [released]

View File

@ -27,7 +27,7 @@ To include Unbound Drag & Drop in your project, add the following dependency to
file: file:
```kotlin ```kotlin
implementation("dev.adriankuta:unbound-drag-drop:0.0.2") implementation("dev.adriankuta:unbound-drag-drop:0.1.0")
``` ```
## Usage ## Usage

View File

@ -7,7 +7,7 @@ plugins {
android { android {
namespace = "dev.adriankuta.unbounddragdrop" namespace = "dev.adriankuta.unbounddragdrop"
version = "0.0.3" version = "0.1.0"
kotlinOptions { kotlinOptions {
jvmTarget = JavaVersion.VERSION_17.toString() jvmTarget = JavaVersion.VERSION_17.toString()
@ -15,7 +15,7 @@ android {
mavenPublishing { mavenPublishing {
coordinates("dev.adriankuta", "unbound-drag-drop", version.toString()) coordinates("dev.adriankuta", "unbound-drag-drop", version.toString())
publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL, automaticRelease = true) publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL)
signAllPublications() signAllPublications()
pom { pom {
name = "Unbound Drag & Drop" name = "Unbound Drag & Drop"

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
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. * 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)
} }
/** /**

View File

@ -1,19 +1,19 @@
[versions] [versions]
androidGradlePlugin = "8.1.4" androidGradlePlugin = "8.1.4"
agp = "8.5.0" agp = "8.5.1"
kotlin = "1.9.0" kotlin = "1.9.24"
coreKtx = "1.13.1" coreKtx = "1.13.1"
junit = "4.13.2" junit = "4.13.2"
junitVersion = "1.1.5" junitVersion = "1.2.1"
espressoCore = "3.5.1" espressoCore = "3.6.1"
appcompat = "1.7.0" appcompat = "1.7.0"
kotlinxCoroutinesAndroid = "1.7.3" kotlinxCoroutinesAndroid = "1.7.3"
lifecycleViewmodelKtx = "2.8.2" lifecycleViewmodelKtx = "2.8.4"
material = "1.12.0" material = "1.12.0"
activity = "1.9.0" activity = "1.9.1"
constraintlayout = "2.1.4" constraintlayout = "2.1.4"
timber = "5.0.1" timber = "5.0.1"
unboundDragDrop = "0.0.1" unboundDragDrop = "0.1.0"
[libraries] [libraries]
android-tools-build-gradle-plugin = { group = "com.android.tools.build", name = "gradle", version.ref = "androidGradlePlugin" } android-tools-build-gradle-plugin = { group = "com.android.tools.build", name = "gradle", version.ref = "androidGradlePlugin" }