gpt4 book ai didi

java - Android kotlin - RecyclerView 应用程序在按特定顺序删除项目后崩溃

转载 作者:行者123 更新时间:2023-11-29 18:40:52 31 4
gpt4 key购买 nike

这是适配器:

class ContactsAdapter(val context: Context, private val users: MutableList<Contacts>, val itemClick: (Contacts) -> Unit) : RecyclerView.Adapter<ContactsAdapter.ViewHolder>(){

override fun onBindViewHolder(holder: ViewHolder, position: Int) {

holder.remove.setOnClickListener {

val builder = AlertDialog.Builder(context)
builder.setMessage(R.string.delete_contact)

builder.setPositiveButton(R.string.yes){_, _ ->
users.removeAt(position)
notifyItemRemoved(position)
}

builder.setNegativeButton(R.string.no){_,_ ->

}

val dialog: AlertDialog = builder.create()
dialog.show()
}
}

override fun getItemCount() = users.size

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.contacts, parent, false)
return ViewHolder(view, itemClick)
}

class ViewHolder(itemView: View?, val itemClick: (Contacts) -> Unit) : RecyclerView.ViewHolder(itemView!!){
val remove = itemView!!.removecontact!!
}
}

我有 2 个项目要测试,当我删除第二个然后第一个时它很好,但是当第一个然后第二个然后应用程序崩溃并且错误是:

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.remove(ArrayList.java:503)
at com.xxx.xxx.classes.ContactsAdapter$onBindViewHolder$2$1.onClick(ContactsAdapter.kt:57)
at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:177)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

可能是什么问题?

提前致谢

最佳答案

如您所见,这是一个 IndexOutOfBoundsException,因为您正试图访问大小为 1 的数组中的索引 1。这主要是因为您直接使用了 position 来自 AlertDialog 的 setPositiveButton 调用内部的 onBindViewHolder 的参数。

改为使用 holder.getAdapterPosition 方法获取最新位置。这应该可以防止崩溃。

编辑 #1:我的意思是用 holder.getAdapterPosition() 替换 position 用法。编辑后您的 onBindViewHolder 应如下所示:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {

holder.remove.setOnClickListener {

val builder = AlertDialog.Builder(context)
builder.setMessage(R.string.delete_contact)

builder.setPositiveButton(R.string.yes){_, _ ->
users.removeAt(holder.getAdapterPosition())
notifyItemRemoved(holder.getAdapterPosition())
}

builder.setNegativeButton(R.string.no){_,_ ->

}

val dialog: AlertDialog = builder.create()
dialog.show()
}
}

关于java - Android kotlin - RecyclerView 应用程序在按特定顺序删除项目后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53116480/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com