Reputation: 141
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
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
}
}
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
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