【问题标题】:RecyclerView OnItemClick returns IndexOutOfBoundsExceptionRecyclerView OnItemClick 返回 IndexOutOfBoundsException
【发布时间】:2019-11-29 03:52:06
【问题描述】:

我已经在我的 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
    }

}

这就是我在片段中的称呼

vendorAdapter?.setOnItemClickListener(object : OnItemClickListener {
            override fun onItemClick(vendor: Vendor) {
                Log.e(TAG,"Clicked")
            }

        })

【问题讨论】:

    标签: android kotlin android-recyclerview


    【解决方案1】:

    您的 holder.vendor 中似乎只有一件物品。

    holder.vendor = listOf(vendor)
    

    这将为供应商分配一个列表,其中只有一个项目。

    作为一个更改最少的解决方案,您可以更改

    listener.onItemClick(vendor[position])
    

    listener.onItemClick(vendor[0])
    

    但是持有一个只有一个项目的数组对我来说不是一个很好的做法。 更换会更好

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

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

    替换

    listener.onItemClick(vendor[position])
    

    listener.onItemClick(vendor)
    

    【讨论】:

      【解决方案2】:

      使用layoutPosition 而不是adapterPosition

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

      adapterPosition

      返回由此表示的项目的适配器位置 ViewHolder。

      请注意,这可能与 getLayoutPosition() 不同,如果 有待处理的适配器更新,但没有新的布局传递 还没发生。

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

      layoutPosition

      根据最新布局返回 ViewHolder 的位置 通过。

      【讨论】:

        猜你喜欢
        • 2016-03-17
        • 2015-06-16
        • 2021-04-02
        • 1970-01-01
        • 1970-01-01
        • 2018-12-08
        • 2016-08-12
        • 1970-01-01
        • 2021-09-30
        相关资源
        最近更新 更多