RecyclerView(Kotlin): Adding an swipe to delete functionality on a ToDo app with data in SQL database

2.6k views Asked by At

I am new to kotlin and android studio and currently I am trying to build an todo list applications with my own ideas. Its mostly done but I have to add edit and delete functionality to the tasks that user adds. The tasks that user adds are stored on the device using SQLiteDatabase. This is the base swipe to delete class that I wrote:

abstract class SwipeToDelete(context: Context, dragDir: Int, swipeDir: Int): ItemTouchHelper.SimpleCallback(dragDir, swipeDir) {
    override fun onMove(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder,
        target: RecyclerView.ViewHolder
    ): Boolean {
        return false
    }
    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
        TODO("Not yet implemented")
    }
}

This is the delete functionality that I have added which works great with a button:

 fun deleteToDo(todoId: Long){
        val db = writableDatabase
        db.delete(TABLE_TODO_ITEM,"$COL_TODO_ID=?", arrayOf(todoId.toString()))
        db.delete(TABLE_TODO,"$COL_ID=?", arrayOf(todoId.toString()))
    }

This is the recyclerview adapter that I am using:

class ItemAdapter(val context: Context,val dbHandler: DBHandler, val list: MutableList<ToDoItem>) :
        RecyclerView.Adapter<ItemAdapter.ViewHolder>(){
        override fun onCreateViewHolder(p0: ViewGroup, p1: Int): ViewHolder {
            return ViewHolder(LayoutInflater.from(context).inflate(R.layout.rv_child_item,p0,false))

        }

        override fun onBindViewHolder(holder: ViewHolder, p1: Int) {
            holder.itemName.text = list[p1].itemName
            holder.itemName.isChecked = list[p1].isCompleted
            holder.itemName.setOnClickListener{
                list[p1].isCompleted = !list[p1].isCompleted
                dbHandler.updateToDoItem(list[p1])
            }
        }

        override fun getItemCount(): Int {
            return list.size
        }
        class ViewHolder(v : View) : RecyclerView.ViewHolder(v){
            val itemName : CheckBox = v.findViewById(R.id.cb_item)
        }
    }

but for some reason I cannot make it work when I try to call the delete function in this Swipetodelete object:

val item = object : SwipeToDelete(this,0,ItemTouchHelper.LEFT){
            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
           }
        }

I also want to add the edit functionality but if i can get this delete functionality to work i can add it.

1

There are 1 answers

0
Bryan Capati On

Since the SwipeToDelete is an abstract class, you can override the onSwiped function on your Fragment/Activity Class.

You can modify your SwipeToDelete class to:

abstract class SwipeToDelete(context: Context, dragDir: Int, swipeDir: Int): ItemTouchHelper.SimpleCallback(dragDir, swipeDir) {
    override fun onMove(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder,
        target: RecyclerView.ViewHolder
    ): Boolean {
        return false
    }
}

And then override the onSwiped function inside your fragment/activity and attach it to your recyclerview:

val item = object : SwipeToDelete(this,0,ItemTouchHelper.LEFT){
    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
        deleteToDo(todoId)
    }
}
ItemTouchHelper(item).attachToRecyclerView(recycler)