I have a list of elements (rv) and a function which deletes elements from adapter on swipe gesture. I also have an undo action. How to delete data from database? It deletes the wrong data.
MainActivity:
val onSwipe = object : OnSwipe(this) {
override fun onSwiped(viewHolder: ViewHolder, direction: Int) {
val cachedPosition = viewHolder.absoluteAdapterPosition
val cachedItem = adapter.listArray[cachedPosition]
when (direction) {
ItemTouchHelper.RIGHT -> {
adapter.removeItem(cachedPosition)
val b =
dbManager.total().toBigDecimal().setScale(2, RoundingMode.HALF_UP)
.toString()
binding.tvResult.text = "Сумма $b ₾"
Snackbar.make(binding.rv, "Deleted", Snackbar.LENGTH_SHORT)
.setAction("Undo") { }
.addCallback(object: BaseTransientBottomBar.BaseCallback<Snackbar>() {
override fun onDismissed(transientBottomBar: Snackbar, event: Int) {
if (event == DISMISS_EVENT_ACTION) adapter.restoreItem(cachedPosition, cachedItem)
else adapter.deleteFromDB(dbManager, cachedPosition)
}
})
.show()
}
}
}
}
Adapter functions:
fun removeItem(pos: Int) {
listArray.removeAt(pos)
notifyItemRemoved(pos)
}
fun deleteFromDB (dbManager: DbManager, pos: Int){
dbManager.removeItem(listArray[pos].id.toString())
}
fun restoreItem(pos: Int, listMain: ListItem) {
listArray.add(pos, listMain)
notifyItemInserted(pos)
}
I see 2 ways :
Delete from database then from RV. But I will need to add data to database again when I use UNDO button. I don't know how to do that.
Change function which deletes from database. How should it look?
Which is more correct? Database delete function:
fun removeItem(_id: String) {
val id = BaseColumns._ID + "=$_id"
db?.delete(DbColumns.TABLE_NAME, id, null)
}
OnSwipe class (shows red line and deleting icon):
abstract class OnSwipe (context: Context): ItemTouchHelper.SimpleCallback (0, ItemTouchHelper.RIGHT) {
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return false
}
override fun onChildDraw(
c: Canvas,
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
dX: Float,
dY: Float,
actionState: Int,
isCurrentlyActive: Boolean
) {
RecyclerViewSwipeDecorator.Builder(
c,
recyclerView,
viewHolder,
dX,
dY,
actionState,
isCurrentlyActive
)
.addSwipeRightBackgroundColor(Color.RED)
.addSwipeRightActionIcon(R.drawable.ic_baseline_delete_24)
.create()
.decorate()
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
}
}