Pawan Acharya
Pawan Acharya

Reputation: 141

Deleting an item in recycler view duplicates the other item

I am using Room as a database and list the data in a RecyclerView. When I try to delete one of the items, then the item below it gets duplicated.

But when I restart app, the duplicated item is also removed (and the item I previously deleted too). I have tried using notifyItemRemoved(position), but still that didn't work.

class HomeFragment : Fragment() {

    private inner class NoteViewHolder(view: View):RecyclerView.ViewHolder(view) {
       val rowName:TextView = view.findViewById(R.id.rec_name)
       val rowType:TextView = view.findViewById(R.id.rec_type)
       val rowSub:TextView = view.findViewById(R.id.rec_sub)
       val daysAgo:TextView = view.findViewById(R.id.how_many_days_ago)
}

private inner class NotesAdapter(val users:List<User>):RecyclerView.Adapter<NoteViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NoteViewHolder {
        val view = layoutInflater.inflate(R.layout.row_recycle, parent, false)
        return  NoteViewHolder(view)
    }

    override fun getItemCount(): Int =users.size

    override fun onBindViewHolder(holder: NoteViewHolder, position: Int) {
        val user = users[position]
        holder.apply{
            rowName.setText(user.name)
            rowSub.setText(user.subject)
            rowType.setText(user.type)
        }

        //To delete
        holder.itemView.setOnLongClickListener {

            val builder = AlertDialog.Builder(requireContext(),R.style.Theme_AppCompat_Light_Dialog_Alert)
            builder.setTitle("Notes Returned?")
            builder.setNegativeButton("Yes",object :DialogInterface.OnClickListener {
                override fun onClick(dialog: DialogInterface?, which: Int) {
                    (activity as MainActivity).db.myDao().deleteData(users[position])
                    notifyItemRemoved(position)
                }
            })
            val alert = builder.create()
            alert.show()
            true
        }
    }
}

MyDao

@Dao
interface MyDao {
    @Delete
    fun deleteData(user: User)
}

User.kt

@Entity
data class User(
    val subject:String,
    val type:String,
    val name: String?,
    val date: String?
)

Mainactivity.kt

lateinit var db: Database
db = Room.databaseBuilder(this,Database::class.java,"User").allowMainThreadQueries().build()

How can I fix this issue?

Upvotes: 1

Views: 2420

Answers (2)

Humxa Moghal
Humxa Moghal

Reputation: 132

Inside your NoteViewHolder, do something like below:

init {
    view.setOnLongClickListener {
        val builder = AlertDialog.Builder(
            requireContext(),
            R.style.Theme_AppCompat_Light_Dialog_Alert
        )
        builder.setTitle("Notes Returned?")
        builder.setNegativeButton("Yes") { dialog, _ ->
            dialog.dismiss()
            context.db.myDao().deleteData(users[adapterPosition])
            notifyItemRemoved(adapterPosition)
        }
        val alert = builder.create()
        alert.show()
        true
    }
}

Full view

private inner class NoteViewHolder(view: View) : RecyclerView.ViewHolder(view) {

    val rowName: TextView = view.findViewById(R.id.rec_name)
    val rowType: TextView = view.findViewById(R.id.rec_type)
    val rowSub: TextView = view.findViewById(R.id.rec_sub)
    val daysAgo: TextView = view.findViewById(R.id.how_many_days_ago)

    init {
        view.setOnLongClickListener {
            val builder = AlertDialog.Builder(
                requireContext(),
                R.style.Theme_AppCompat_Light_Dialog_Alert
            )
            builder.setTitle("Notes Returned?")
            builder.setNegativeButton("Yes") { dialog, _ ->
                dialog.dismiss()
                context.db.myDao().deleteData(users[adapterPosition])
                notifyItemRemoved(adapterPosition)
            }
            val alert = builder.create()
            alert.show()
            true
        }
    }
}

Upvotes: 0

Md. Asaduzzaman
Md. Asaduzzaman

Reputation: 15433

First delete from the list and then call notifyItemRemoved. Check below.

override fun onClick(dialog: DialogInterface?, which: Int) {
    (activity as MainActivity).db.myDao().deleteData(users[position])

    users.removeAt(position) // Delete from list
    notifyItemRemoved(position)
}

N.B: Your list should be MutableList instead of List to perform the operation.

Upvotes: 4

Related Questions