Android RecyclerView OnItemClick返回IndexOutOfBoundsException

Android RecyclerView OnItemClick返回IndexOutOfBoundsException,android,kotlin,android-recyclerview,Android,Kotlin,Android Recyclerview,我已经在我的Recyclerview中实现了一个onclick侦听器,但是我一直得到一个IndexOutOfBoundsException,当我单击第一个项目时,一切正常,但是在第一个项目之后,我得到了错误 当我点击第二个项目时,我得到了这个错误 java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 第二个是这个 java.lang.IndexOutOfBoundsException: Index: 2, Size: 1 等等 我的适配

我已经在我的Recyclerview中实现了一个onclick侦听器,但是我一直得到一个IndexOutOfBoundsException,当我单击第一个项目时,一切正常,但是在第一个项目之后,我得到了错误

当我点击第二个项目时,我得到了这个错误

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
第二个是这个

java.lang.IndexOutOfBoundsException: Index: 2, Size: 1
等等

我的适配器看起来像这样

class VendorAdapter(private val vendorModel: List<Vendor>) : RecyclerView.Adapter<VendorAdapter.VendorView>() {

    private lateinit var listener: OnItemClickListener

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VendorView {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.row_vendor, parent, false)
        return VendorView(view, vendorModel, listener)
    }

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

        val vendor = vendorModel[position]

       holder.vendorName.text = vendor.name


        Picasso.get()
                .load(vendorModel[position].img_url)
                .fit()
                .centerCrop()
                .into(holder.vendorImage)

        holder.vendor = listOf(vendor)

    }

    override fun getItemCount(): Int {
        return vendorModel.size
    }

    class VendorView(itemView: View, var vendor: List<Vendor>, listener: OnItemClickListener) : RecyclerView.ViewHolder(itemView) {



        val vendorImage: ImageView = itemView.findViewById<View>(R.id.vendor_image) as ImageView
        val vendorName: TextView = itemView.findViewById(R.id.vendor_name)


        init {
            itemView.setOnClickListener {
                val position: Int = adapterPosition
                listener.onItemClick(vendor[position])
            }
        }
    }

    interface OnItemClickListener{
        fun onItemClick(vendor: Vendor)
    }

    fun setOnItemClickListener(listener: OnItemClickListener){
        this.listener = listener
    }

}

看起来您的holder.vendor中只有一项

holder.vendor = listOf(vendor)
这将为供应商分配一个仅包含一项的列表

holder.vendor = listOf(vendor)
作为一个只需最少更改的解决方案,您可以更改

listener.onItemClick(vendor[position])
listener.onItemClick(vendor[position])

但是持有一个只有一个物品的数组对我来说不是一个很好的练习。 最好是更换

class VendorView(itemView: View, var vendor: List<Vendor>, listener: OnItemClickListener) : RecyclerView.ViewHolder(itemView) {
替换


使用
layoutPosition
代替
adapterPosition

 itemView.setOnClickListener {
                val position: Int = layoutPosition //adapterPosition
                listener.onItemClick(vendor[position])
            }

返回此表达式表示的项的适配器位置 视窗持有人

请注意,这可能与getLayoutPosition()不同,如果 存在挂起的适配器更新,但尚未更新新的布局过程 事情还没有发生

RecyclerView在下一个布局之前不会处理任何适配器更新 穿越。这可能会在用户之间造成暂时的不一致 查看屏幕上的内容以及适配器内容。

返回ViewHolder在最新布局中的位置 通过

listener.onItemClick(vendor[position])
listener.onItemClick(vendor)
 itemView.setOnClickListener {
                val position: Int = layoutPosition //adapterPosition
                listener.onItemClick(vendor[position])
            }