Fix for multiple open items at once

This commit is contained in:
Luna712 2024-06-13 15:01:08 -06:00 committed by GitHub
parent b3af98cae0
commit 0ceb273b35
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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)
}
} }
} }