mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
Fix for multiple open items at once
This commit is contained in:
parent
b3af98cae0
commit
0ceb273b35
1 changed files with 32 additions and 18 deletions
|
@ -300,6 +300,9 @@ class DownloadFragment : Fragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
class SwipeToDeleteCallback(private val adapter: DownloadHeaderAdapter) : ItemTouchHelper.Callback() {
|
class SwipeToDeleteCallback(private val adapter: DownloadHeaderAdapter) : ItemTouchHelper.Callback() {
|
||||||
|
|
||||||
|
private val swipeOpenItems: MutableSet<Int> = mutableSetOf()
|
||||||
|
|
||||||
override fun getMovementFlags(
|
override fun getMovementFlags(
|
||||||
recyclerView: RecyclerView,
|
recyclerView: RecyclerView,
|
||||||
viewHolder: RecyclerView.ViewHolder
|
viewHolder: RecyclerView.ViewHolder
|
||||||
|
@ -325,8 +328,7 @@ class SwipeToDeleteCallback(private val adapter: DownloadHeaderAdapter) : ItemTo
|
||||||
direction: Int
|
direction: Int
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
private fun handleDelete(viewHolder: RecyclerView.ViewHolder) {
|
private fun handleDelete(position: Int) {
|
||||||
val position = viewHolder.bindingAdapterPosition
|
|
||||||
val item = adapter.cardList[position]
|
val item = adapter.cardList[position]
|
||||||
|
|
||||||
runOnMainThread {
|
runOnMainThread {
|
||||||
|
@ -336,7 +338,7 @@ class SwipeToDeleteCallback(private val adapter: DownloadHeaderAdapter) : ItemTo
|
||||||
DOWNLOAD_ACTION_DELETE_FILE,
|
DOWNLOAD_ACTION_DELETE_FILE,
|
||||||
clickEvent
|
clickEvent
|
||||||
)
|
)
|
||||||
) { adapter.notifyItemRemoved(viewHolder.absoluteAdapterPosition) }
|
) { adapter.notifyItemRemoved(position) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -356,6 +358,8 @@ class SwipeToDeleteCallback(private val adapter: DownloadHeaderAdapter) : ItemTo
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val position = viewHolder.bindingAdapterPosition
|
||||||
|
|
||||||
val deleteIcon: Drawable = ContextCompat.getDrawable(
|
val deleteIcon: Drawable = ContextCompat.getDrawable(
|
||||||
recyclerView.context,
|
recyclerView.context,
|
||||||
R.drawable.ic_baseline_delete_outline_24
|
R.drawable.ic_baseline_delete_outline_24
|
||||||
|
@ -375,9 +379,7 @@ class SwipeToDeleteCallback(private val adapter: DownloadHeaderAdapter) : ItemTo
|
||||||
|
|
||||||
val maxSwipeDistance = 230f
|
val maxSwipeDistance = 230f
|
||||||
val minSwipeDistance = itemView.width / 4.5f
|
val minSwipeDistance = itemView.width / 4.5f
|
||||||
val swipeDistance = if (minSwipeDistance <= maxSwipeDistance) {
|
val swipeDistance = minOf(minSwipeDistance, maxSwipeDistance)
|
||||||
minSwipeDistance
|
|
||||||
} else maxSwipeDistance
|
|
||||||
|
|
||||||
val limitedDX = if (dX < -swipeDistance) -swipeDistance else if (dX >= 0) 0f else dX
|
val limitedDX = if (dX < -swipeDistance) -swipeDistance else if (dX >= 0) 0f else dX
|
||||||
|
|
||||||
|
@ -410,25 +412,37 @@ class SwipeToDeleteCallback(private val adapter: DownloadHeaderAdapter) : ItemTo
|
||||||
deleteIcon.draw(c)
|
deleteIcon.draw(c)
|
||||||
|
|
||||||
if (dX <= -swipeDistance && !isCurrentlyActive) {
|
if (dX <= -swipeDistance && !isCurrentlyActive) {
|
||||||
|
swipeOpenItems.add(position)
|
||||||
|
} else {
|
||||||
|
swipeOpenItems.remove(position)
|
||||||
|
super.onChildDraw(c, recyclerView, viewHolder, limitedDX, dY, actionState, isCurrentlyActive)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (swipeOpenItems.isNotEmpty()) {
|
||||||
recyclerView.setOnTouchListener { _, event ->
|
recyclerView.setOnTouchListener { _, event ->
|
||||||
if (event.action == MotionEvent.ACTION_UP) {
|
if (event.action == MotionEvent.ACTION_UP) {
|
||||||
val x = event.x.toInt()
|
val x = event.x.toInt()
|
||||||
val y = event.y.toInt()
|
val y = event.y.toInt()
|
||||||
|
var handled = false
|
||||||
|
|
||||||
val backgroundLeft = itemView.right + limitedDX.toInt()
|
swipeOpenItems.forEach { pos ->
|
||||||
val backgroundRight = itemView.right
|
val vh = recyclerView.findViewHolderForAdapterPosition(pos)
|
||||||
val backgroundTop = itemView.top
|
if (vh != null) {
|
||||||
val backgroundBottom = itemView.bottom
|
val swipeItemView = vh.itemView
|
||||||
|
val backgroundLeft = swipeItemView.right - swipeDistance.toInt()
|
||||||
|
val backgroundRight = swipeItemView.right
|
||||||
|
val backgroundTop = swipeItemView.top
|
||||||
|
val backgroundBottom = swipeItemView.bottom
|
||||||
|
|
||||||
if (x in backgroundLeft..backgroundRight && y >= backgroundTop && y <= backgroundBottom) {
|
if (x in backgroundLeft..backgroundRight && y in backgroundTop .. backgroundBottom) {
|
||||||
handleDelete(viewHolder)
|
handleDelete(pos)
|
||||||
true
|
handled = true
|
||||||
} else false
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
handled
|
||||||
} else false
|
} else false
|
||||||
}
|
}
|
||||||
} else {
|
} else recyclerView.setOnTouchListener(null)
|
||||||
recyclerView.setOnTouchListener(null)
|
|
||||||
super.onChildDraw(c, recyclerView, viewHolder, limitedDX, dY, actionState, isCurrentlyActive)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Add table
Add a link
Reference in a new issue