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

2 java android kotlin android-recyclerview

这是适配器:

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!!
    }
}
Run Code Online (Sandbox Code Playgroud)

我有 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)
Run Code Online (Sandbox Code Playgroud)

可能是什么问题呢?

提前致谢

shr*_*ilc 6

正如您所看到的,它是一个IndexOutOfBoundsException,因为您正在尝试访问大小为 1 的数组中的索引 1。这主要是因为您直接使用AlertDialog 调用内部的position参数。onBindViewHoldersetPositiveButton

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

编辑#1:我的意思是positionholder.getAdapterPosition(). 编辑后,您的 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()
    }
}
Run Code Online (Sandbox Code Playgroud)