Android 删除“回收器”视图中的项目会复制其他项目
我正在使用Android 删除“回收器”视图中的项目会复制其他项目,android,kotlin,android-recyclerview,android-room,Android,Kotlin,Android Recyclerview,Android Room,我正在使用房间作为数据库,并在回收视图中列出数据。当我尝试删除其中一个项目时,它下面的项目将被复制 但当我重新启动应用程序时,重复的项目也会被删除(之前删除的项目也会被删除)。 我尝试过使用notifyItemRemoved(position),但仍然不起作用 class HomeFragment : Fragment() { private inner class NoteViewHolder(view: View):RecyclerView.ViewHolder(view) {
房间
作为数据库
,并在回收视图
中列出数据。当我尝试删除其中一个项目时,它下面的项目将被复制
但当我重新启动应用程序时,重复的项目也会被删除(之前删除的项目也会被删除)。
我尝试过使用notifyItemRemoved(position)
,但仍然不起作用
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
}
}
}
User.kt
@Entity
data class User(
val subject:String,
val type:String,
val name: String?,
val date: String?
)
lateinit var db: Database
db = Room.databaseBuilder(this,Database::class.java,"User").allowMainThreadQueries().build()
Mainactivity.kt
@Entity
data class User(
val subject:String,
val type:String,
val name: String?,
val date: String?
)
lateinit var db: Database
db = Room.databaseBuilder(this,Database::class.java,"User").allowMainThreadQueries().build()
如何解决此问题?首先从列表中删除,然后调用
notifyItemRemoved
。检查下面
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:您的列表应该是
MutableList
而不是list
来执行操作。首先从列表中删除,然后调用notifyItemRemoved
。检查下面
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:您的列表应该是
MutableList
而不是list
来执行该操作。在记事本夹内,执行以下操作:
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
}
}
全景
在您的记事本中,执行以下操作:
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
}
}
全景
(活动作为MainActivity).db.myDao().deleteData(用户[position])
此行从数据库中删除是的,但不是从连接到RecycleService的当前列表中删除,并且它在重新启动后显示正确的数据,就像在重新启动期间一样,从db
获取数据并更新列表。尝试我的解决方案并检查我找不到removeAt
方法。然后尝试users.remove(position)
(活动作为MainActivity.db.myDao().deleteData(users[position])
此行从数据库中删除是,但不是从连接到RecycleService的当前列表中,它在重新启动后显示正确的数据,就像在重新启动期间一样,它从DB
获取数据并更新列表。尝试我的解决方案并检查我找不到removeAt
方法。然后尝试用户。删除(位置)