Android RecyclerView OnItemClick返回IndexOutOfBoundsException
我已经在我的Recyclerview中实现了一个onclick侦听器,但是我一直得到一个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 等等 我的适配
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])
}