From 90d1fcf61a01084741ec7dbf936e1c4626ea7515 Mon Sep 17 00:00:00 2001 From: Priyansh-Kedia Date: Fri, 23 Oct 2020 18:03:12 +0530 Subject: [PATCH 1/7] drag and drop complete --- .../com/kedia/swipetodelete/DragAndDrop.kt | 2 +- .../swipetodelete/ItemTouchHelperAdapter.kt | 7 --- .../com/kedia/swipetodelete/SwipeToDelete.kt | 51 ------------------ .../com/kedia/customswipelibrary/Adapter.kt | 53 +------------------ .../kedia/customswipelibrary/MainActivity.kt | 14 +---- 5 files changed, 4 insertions(+), 123 deletions(-) delete mode 100644 SwipeToDelete/src/main/java/com/kedia/swipetodelete/ItemTouchHelperAdapter.kt delete mode 100644 SwipeToDelete/src/main/java/com/kedia/swipetodelete/SwipeToDelete.kt diff --git a/SwipeToDelete/src/main/java/com/kedia/swipetodelete/DragAndDrop.kt b/SwipeToDelete/src/main/java/com/kedia/swipetodelete/DragAndDrop.kt index 073cbd8..3e23133 100644 --- a/SwipeToDelete/src/main/java/com/kedia/swipetodelete/DragAndDrop.kt +++ b/SwipeToDelete/src/main/java/com/kedia/swipetodelete/DragAndDrop.kt @@ -52,7 +52,7 @@ object DragAndDrop: View.OnTouchListener, GestureDetector.OnGestureListener { viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder ): Boolean { - (adapter as ItemTouchHelperAdapter).onItemMove(viewHolder.adapterPosition, target.adapterPosition) + adapter?.notifyItemMoved(viewHolder.adapterPosition, target.adapterPosition) return true } diff --git a/SwipeToDelete/src/main/java/com/kedia/swipetodelete/ItemTouchHelperAdapter.kt b/SwipeToDelete/src/main/java/com/kedia/swipetodelete/ItemTouchHelperAdapter.kt deleted file mode 100644 index b297cbd..0000000 --- a/SwipeToDelete/src/main/java/com/kedia/swipetodelete/ItemTouchHelperAdapter.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.kedia.swipetodelete - -interface ItemTouchHelperAdapter { - - fun onItemMove(fromPosition: Int, toPosition: Int) - -} diff --git a/SwipeToDelete/src/main/java/com/kedia/swipetodelete/SwipeToDelete.kt b/SwipeToDelete/src/main/java/com/kedia/swipetodelete/SwipeToDelete.kt deleted file mode 100644 index 9621725..0000000 --- a/SwipeToDelete/src/main/java/com/kedia/swipetodelete/SwipeToDelete.kt +++ /dev/null @@ -1,51 +0,0 @@ -package com.kedia.swipetodelete - -import androidx.recyclerview.widget.ItemTouchHelper -import androidx.recyclerview.widget.ItemTouchHelper.RIGHT -import androidx.recyclerview.widget.RecyclerView - -object SwipeToDelete { - - fun RecyclerView.addSwipeToDelete( - list: List = emptyList(), - listener: OnSwiped? = null - ) { - - var swipeDirs = RIGHT - for (element in list) { - if (element != DIRECTION.RIGHT) { - swipeDirs = swipeDirs or DIRECTION.valueOf(element.name).direction - } - } - - val simpleCallback = object : ItemTouchHelper.SimpleCallback(0 , swipeDirs) { - override fun onMove( - recyclerView: RecyclerView, - viewHolder: RecyclerView.ViewHolder, - target: RecyclerView.ViewHolder - ): Boolean { - return false - } - - override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { - this@addSwipeToDelete.adapter?.notifyItemRemoved(viewHolder.adapterPosition) - listener?.swipeToDelete(adapterPosition = viewHolder.adapterPosition) - } - - } - ItemTouchHelper(simpleCallback).attachToRecyclerView(this) - } - - interface OnSwiped { - fun swipeToDelete(adapterPosition: Int) - } - - enum class DIRECTION(val direction: Int) { - UP (ItemTouchHelper.UP), - DOWN(ItemTouchHelper.DOWN), - RIGHT(ItemTouchHelper.RIGHT), - LEFT(ItemTouchHelper.LEFT) - } - - -} \ No newline at end of file diff --git a/app/src/main/java/com/kedia/customswipelibrary/Adapter.kt b/app/src/main/java/com/kedia/customswipelibrary/Adapter.kt index 37695fe..2e8fefc 100644 --- a/app/src/main/java/com/kedia/customswipelibrary/Adapter.kt +++ b/app/src/main/java/com/kedia/customswipelibrary/Adapter.kt @@ -7,7 +7,6 @@ import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.recyclerview.widget.RecyclerView -import com.kedia.swipetodelete.ItemTouchHelperAdapter class Adapter( private val context: Context, @@ -26,63 +25,13 @@ class Adapter( holder.bind(list[position]) } - inner class CustomViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) -// GestureDetector.OnGestureListener, View.OnTouchListener - { + inner class CustomViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private var textView = itemView.findViewById(R.id.textView) - private lateinit var gestureDetector: GestureDetector fun bind(string: String) { textView.text = string - // textView.setGestures() -// gestureDetector = GestureDetector(itemView.context, this) -// itemView.setOnTouchListener(this) } - -// override fun onDown(e: MotionEvent?): Boolean { -// return false -// } -// -// override fun onShowPress(e: MotionEvent?) {} -// -// override fun onSingleTapUp(e: MotionEvent?): Boolean { -// -// return false -// } -// -// override fun onScroll( -// e1: MotionEvent?, -// e2: MotionEvent?, -// distanceX: Float, -// distanceY: Float -// ): Boolean { -// return false -// } -// -// override fun onLongPress(e: MotionEvent?) { -// Log.d("TAG!!!!","called long") -// touchHelper?.startDrag(this) -// } -// -// override fun onFling( -// e1: MotionEvent?, -// e2: MotionEvent?, -// velocityX: Float, -// velocityY: Float -// ): Boolean { -// return false -// } - -// override fun onTouch(v: View?, event: MotionEvent?): Boolean { -// gestureDetector.onTouchEvent(event) -// return true -// } - } -// override fun onItemMove(fromPosition: Int, toPosition: Int) { -// notifyItemMoved(fromPosition, toPosition) -// } - } diff --git a/app/src/main/java/com/kedia/customswipelibrary/MainActivity.kt b/app/src/main/java/com/kedia/customswipelibrary/MainActivity.kt index 3939c9d..c7b674f 100644 --- a/app/src/main/java/com/kedia/customswipelibrary/MainActivity.kt +++ b/app/src/main/java/com/kedia/customswipelibrary/MainActivity.kt @@ -1,15 +1,12 @@ package com.kedia.customswipelibrary -import androidx.appcompat.app.AppCompatActivity import android.os.Bundle -import android.util.Log +import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.LinearLayoutManager -import com.kedia.swipetodelete.SwipeToDelete import com.kedia.swipetodelete.DragAndDrop.addDragToSwipe -import com.kedia.swipetodelete.SwipeToDelete.addSwipeToDelete import kotlinx.android.synthetic.main.activity_main.* -class MainActivity : AppCompatActivity(), SwipeToDelete.OnSwiped { +class MainActivity : AppCompatActivity() { private val list = mutableListOf() private lateinit var adapter: Adapter @@ -26,15 +23,8 @@ class MainActivity : AppCompatActivity(), SwipeToDelete.OnSwiped { layoutManager = LinearLayoutManager(this@MainActivity) adapter = this@MainActivity.adapter } - recycler.addDragToSwipe() - val list = listOf(SwipeToDelete.DIRECTION.LEFT, - SwipeToDelete.DIRECTION.RIGHT) - recycler.addSwipeToDelete(list, this) } - override fun swipeToDelete(adapterPosition: Int) { - Log.d("TAG!!!!", adapter.itemCount.toString()) - } } \ No newline at end of file From 3cf50f5c309e1863870a653c9cce722cabe10856 Mon Sep 17 00:00:00 2001 From: Priyansh-Kedia Date: Fri, 23 Oct 2020 23:15:43 +0530 Subject: [PATCH 2/7] added interface methods --- .../main/java/com/kedia/swipetodelete/DragAndDrop.kt | 7 ++++++- .../java/com/kedia/customswipelibrary/MainActivity.kt | 10 ++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/SwipeToDelete/src/main/java/com/kedia/swipetodelete/DragAndDrop.kt b/SwipeToDelete/src/main/java/com/kedia/swipetodelete/DragAndDrop.kt index 3e23133..5ca2cb7 100644 --- a/SwipeToDelete/src/main/java/com/kedia/swipetodelete/DragAndDrop.kt +++ b/SwipeToDelete/src/main/java/com/kedia/swipetodelete/DragAndDrop.kt @@ -13,7 +13,7 @@ object DragAndDrop: View.OnTouchListener, GestureDetector.OnGestureListener { private lateinit var holder: RecyclerView.ViewHolder - fun RecyclerView.addDragToSwipe(): ItemTouchHelper { + fun RecyclerView.addDragToSwipe(listener: onDragged): ItemTouchHelper { val itemTouchCallback = object : ItemTouchHelper.Callback() { override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { @@ -52,6 +52,7 @@ object DragAndDrop: View.OnTouchListener, GestureDetector.OnGestureListener { viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder ): Boolean { + listener.onPositionDragged(viewHolder.adapterPosition, target.adapterPosition) adapter?.notifyItemMoved(viewHolder.adapterPosition, target.adapterPosition) return true } @@ -111,4 +112,8 @@ object DragAndDrop: View.OnTouchListener, GestureDetector.OnGestureListener { return false } + interface onDragged { + fun onPositionDragged(positionStart: Int, positionEnd: Int) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/kedia/customswipelibrary/MainActivity.kt b/app/src/main/java/com/kedia/customswipelibrary/MainActivity.kt index c7b674f..b62cbfc 100644 --- a/app/src/main/java/com/kedia/customswipelibrary/MainActivity.kt +++ b/app/src/main/java/com/kedia/customswipelibrary/MainActivity.kt @@ -1,12 +1,14 @@ package com.kedia.customswipelibrary import android.os.Bundle +import android.util.Log import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.LinearLayoutManager +import com.kedia.swipetodelete.DragAndDrop import com.kedia.swipetodelete.DragAndDrop.addDragToSwipe import kotlinx.android.synthetic.main.activity_main.* -class MainActivity : AppCompatActivity() { +class MainActivity : AppCompatActivity(), DragAndDrop.onDragged { private val list = mutableListOf() private lateinit var adapter: Adapter @@ -23,8 +25,12 @@ class MainActivity : AppCompatActivity() { layoutManager = LinearLayoutManager(this@MainActivity) adapter = this@MainActivity.adapter } - recycler.addDragToSwipe() + recycler.addDragToSwipe(this) } + override fun onPositionDragged(positionStart: Int, positionEnd: Int) { + Log.d("TAG!!!!", "$positionEnd $positionStart") + } + } \ No newline at end of file From f069abac6b5e588502aceb1ed9261a058c3415e5 Mon Sep 17 00:00:00 2001 From: Priyansh-Kedia Date: Fri, 23 Oct 2020 23:38:51 +0530 Subject: [PATCH 3/7] minor change --- .../src/main/java/com/kedia/swipetodelete/DragAndDrop.kt | 4 ++-- .../main/java/com/kedia/customswipelibrary/MainActivity.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SwipeToDelete/src/main/java/com/kedia/swipetodelete/DragAndDrop.kt b/SwipeToDelete/src/main/java/com/kedia/swipetodelete/DragAndDrop.kt index 5ca2cb7..3a3338f 100644 --- a/SwipeToDelete/src/main/java/com/kedia/swipetodelete/DragAndDrop.kt +++ b/SwipeToDelete/src/main/java/com/kedia/swipetodelete/DragAndDrop.kt @@ -13,7 +13,7 @@ object DragAndDrop: View.OnTouchListener, GestureDetector.OnGestureListener { private lateinit var holder: RecyclerView.ViewHolder - fun RecyclerView.addDragToSwipe(listener: onDragged): ItemTouchHelper { + fun RecyclerView.addDragToSwipe(listener: onDragged? = null): ItemTouchHelper { val itemTouchCallback = object : ItemTouchHelper.Callback() { override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { @@ -52,7 +52,7 @@ object DragAndDrop: View.OnTouchListener, GestureDetector.OnGestureListener { viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder ): Boolean { - listener.onPositionDragged(viewHolder.adapterPosition, target.adapterPosition) + listener?.onPositionDragged(viewHolder.adapterPosition, target.adapterPosition) adapter?.notifyItemMoved(viewHolder.adapterPosition, target.adapterPosition) return true } diff --git a/app/src/main/java/com/kedia/customswipelibrary/MainActivity.kt b/app/src/main/java/com/kedia/customswipelibrary/MainActivity.kt index b62cbfc..f6fb536 100644 --- a/app/src/main/java/com/kedia/customswipelibrary/MainActivity.kt +++ b/app/src/main/java/com/kedia/customswipelibrary/MainActivity.kt @@ -25,7 +25,7 @@ class MainActivity : AppCompatActivity(), DragAndDrop.onDragged { layoutManager = LinearLayoutManager(this@MainActivity) adapter = this@MainActivity.adapter } - recycler.addDragToSwipe(this) + recycler.addDragToSwipe() } From ce46b58768c391f8f3dcffeffeb13f77ce0c2d70 Mon Sep 17 00:00:00 2001 From: Priyansh-Kedia Date: Sat, 24 Oct 2020 00:03:33 +0530 Subject: [PATCH 4/7] added implementation of interface method --- .../java/com/kedia/customswipelibrary/Adapter.kt | 12 +++++++++++- .../com/kedia/customswipelibrary/MainActivity.kt | 4 ++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/kedia/customswipelibrary/Adapter.kt b/app/src/main/java/com/kedia/customswipelibrary/Adapter.kt index 2e8fefc..2507b85 100644 --- a/app/src/main/java/com/kedia/customswipelibrary/Adapter.kt +++ b/app/src/main/java/com/kedia/customswipelibrary/Adapter.kt @@ -1,6 +1,7 @@ package com.kedia.customswipelibrary import android.content.Context +import android.util.Log import android.view.GestureDetector import android.view.LayoutInflater import android.view.View @@ -10,7 +11,7 @@ import androidx.recyclerview.widget.RecyclerView class Adapter( private val context: Context, - private val list: List + private val list: MutableList ): RecyclerView.Adapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder { @@ -25,6 +26,15 @@ class Adapter( holder.bind(list[position]) } + fun moveItem(positionStart: Int, positionEnd: Int) { + val temp = list[positionEnd] + Log.d("TAG!!!!", temp) + list[positionEnd] = list[positionStart] + Log.d("TAG!!!!", list[positionEnd]) + list[positionStart] = temp + Log.d("TAG!!!!", list[positionStart]) + } + inner class CustomViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private var textView = itemView.findViewById(R.id.textView) diff --git a/app/src/main/java/com/kedia/customswipelibrary/MainActivity.kt b/app/src/main/java/com/kedia/customswipelibrary/MainActivity.kt index f6fb536..01903a7 100644 --- a/app/src/main/java/com/kedia/customswipelibrary/MainActivity.kt +++ b/app/src/main/java/com/kedia/customswipelibrary/MainActivity.kt @@ -25,12 +25,12 @@ class MainActivity : AppCompatActivity(), DragAndDrop.onDragged { layoutManager = LinearLayoutManager(this@MainActivity) adapter = this@MainActivity.adapter } - recycler.addDragToSwipe() + recycler.addDragToSwipe(this) } override fun onPositionDragged(positionStart: Int, positionEnd: Int) { - Log.d("TAG!!!!", "$positionEnd $positionStart") + adapter.moveItem(positionStart, positionEnd) } } \ No newline at end of file From 18bf6b33955cfdf32537fcc3b9cd369ab8aaa2b4 Mon Sep 17 00:00:00 2001 From: Priyansh-Kedia Date: Sat, 24 Oct 2020 11:54:44 +0530 Subject: [PATCH 5/7] removed debug log statements --- app/src/main/java/com/kedia/customswipelibrary/Adapter.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/java/com/kedia/customswipelibrary/Adapter.kt b/app/src/main/java/com/kedia/customswipelibrary/Adapter.kt index 2507b85..d1b297b 100644 --- a/app/src/main/java/com/kedia/customswipelibrary/Adapter.kt +++ b/app/src/main/java/com/kedia/customswipelibrary/Adapter.kt @@ -28,11 +28,8 @@ class Adapter( fun moveItem(positionStart: Int, positionEnd: Int) { val temp = list[positionEnd] - Log.d("TAG!!!!", temp) list[positionEnd] = list[positionStart] - Log.d("TAG!!!!", list[positionEnd]) list[positionStart] = temp - Log.d("TAG!!!!", list[positionStart]) } inner class CustomViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { From 79f507b1397f2e1c8ccc336d71eeb8d3f4168220 Mon Sep 17 00:00:00 2001 From: Priyansh-Kedia Date: Sat, 24 Oct 2020 11:56:35 +0530 Subject: [PATCH 6/7] modified README --- README.md | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 509f9f4..d3bcc2c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,56 @@ # SwipeLibrary -Extension Library to add swipe functionality to the RecyclerView +SwipeLibrary provides extension functions for handling swipe actions in RecyclerView. + +You can add **Swipe To Delete** and **Drag and Shift** like functionalities with just one line of code. + + +# Extension Functions + +SwipeLibrary contains the following functions: +- [Swipe To Delete](#swipe-to-delete) +- [Drag to Shift](#drag-to-shift) + +## Swipe To Delete + +Add swipe to delete RecyclerView's items from the list, which a single line of code. + +Use *addSwipeToDelete* as RecyclerView's extension function, to add this functionality to your RecyclerView. +This extension function has **two** optional parameter. +> The first parameter is the list of directions in which swipe should be allowed. The directions can be either **TOP**, **BOTTOM**, **RIGHT**, **LEFT**. +The list of directions can be made like this, + `val list = listOf(SwipeToDelete.DIRECTION.LEFT,SwipeToDelete.DIRECTION.RIGHT)` +If no value is passed for the list, by default, **RIGHT** is the direction for swipe. + +> The second parameter is the *listener* for the interface method. The by default value of this parameter is null. If passed, the activity/fragment should implement `SwipeToDelete.OnSwiped`. This method will be called when the RecyclerView item is swiped out, and it returns the position of the element that was swiped. + +**Implementation of interface method** +In a notes app, if you wish to delete the note from your database, after it is swiped, then you can used this method to perform the action. The note can be deleted by getting the *NOTE* using the adapter position inside the list passed to RecyclerView Adapter. + + override fun swipeToDelete(adapterPosition: Int) { + adapter.removeItem(adapterPosition) + } + +[![rec-2020-10-24_00.08.27.gif](https://s8.gifyu.com/images/rec-2020-10-24_00.08.27.gif)](https://gifyu.com/image/8jlD) + + +--- +*** +___ + +## Drag To Shift + +Highlight, move and shift items of RecyclerView with just a single line of code. +Use *addDragToSwipe* as RecyclerView's extension function, to add this functionality to your RecyclerView. This extension has **one** optional parameter. + +> The parameter is the listener for the interface method. The by default value for this parameter is null. If passed, the activity/fragment should implement `DragAndDrop.onDragged`. This method will be called when the RecyclerView item is dragged and dropped to some other position, and it returns the two positions that were swapped. + +**Implementation of interface method** :- +In a notes app, if you wish to change positions of two notes in your database, after they are swapped, then you can used this method to perform the action. The notes can be swapped by getting the _NOTES_ using the adapter positions inside the list passed to RecyclerView Adapter. + + override fun onPositionDragged(positionStart: Int, positionEnd: Int) { + adapter.moveItem(positionStart, positionEnd) + } + +[![rec-2020-10-24_00.10.0459f8d3ce489a4f0f.gif](https://s8.gifyu.com/images/rec-2020-10-24_00.10.0459f8d3ce489a4f0f.gif)](https://gifyu.com/image/8jl5) + From 5ad0bc63b1ad314366db70e3ba153b63f06ba9d8 Mon Sep 17 00:00:00 2001 From: Priyansh-Kedia Date: Sat, 24 Oct 2020 14:48:22 +0530 Subject: [PATCH 7/7] updated readme --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d3bcc2c..0167a20 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,14 @@ In a notes app, if you wish to delete the note from your database, after it is s adapter.removeItem(adapterPosition) } -[![rec-2020-10-24_00.08.27.gif](https://s8.gifyu.com/images/rec-2020-10-24_00.08.27.gif)](https://gifyu.com/image/8jlD) +> The third parameter is an optional parameter, for the Color integer, if the user wants a color in the background when the view is swiped out. This is how the user can pass the Color int as the parameter, `ContextCompat.getColor(this, R.color.colorAccent)` + +[![rec-2020-10-24_14.38.15.gif](https://s8.gifyu.com/images/rec-2020-10-24_14.38.15.gif)](https://gifyu.com/image/8FMg) + + +> The fourth parameter is an optional parameter, for the second Color integer, if the user wants two colors in the background, the user can pass both **Parameter 3 and Parameter 4**. + +[![rec-2020-10-24_14.43.59.gif](https://s8.gifyu.com/images/rec-2020-10-24_14.43.59.gif)](https://gifyu.com/image/8Fpk) ---