【问题标题】:java.lang.IndexOutOfBoundsException: Index: 2, Size: 2 in Spinner Item Selectionjava.lang.IndexOutOfBoundsException: Index: 2, Size: 2 in Spinner Item Selection
【发布时间】:2020-03-16 23:37:00
【问题描述】:

我尝试点击 Spinner 项目,当我点击 1 Kg 时它崩溃并给出错误提示

块引用 java.lang.IndexOutOfBoundsException:索引:2,大小:2

这是我的 Spinner 和 It listner 的代码:-

这是我的静态数组:-

 val values = arrayOf(
        "250 gm",
        "500 gm",
        "1 Kg",
        "2 Kg",
        "3 Kg",
        "4 Kg", "5 Kg", "6 Kg", "7 Kg"
    )

设置 ArrayAdapter :-

 ArrayAdapter(
        context,
        android.R.layout.simple_spinner_item,
        values
    ).also {
        it.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
        holder.product_spinner_kg.adapter = it
    }

这是这个微调器的Listner:-

holder.product_spinner_kg.onItemSelectedListener =
        object : AdapterView.OnItemSelectedListener {
            override fun onNothingSelected(parent: AdapterView<*>?) {

            }

            override fun onItemSelected(
                parent: AdapterView<*>?, view: View?, position: Int, id: Long
            ) {


                selectedQty = values[position]

                if (position == 0) {
                    holder.product_price.text =
                        "Rs. " + (items[position].price.toDouble() * 0.25)
                } else if (position == 1) {
                    holder.product_price.text =
                        "Rs. " + (items[position].price.toDouble() * 0.50)
                } else if (position == 2) {
                    holder.product_price.text =
                        "Rs. " + (items[position].price.toDouble() * 1.00)
                } else if (position == 3) {
                    holder.product_price.text =
                        "Rs. " + (items[position].price.toDouble() * 2.00)
                } else if (position == 4) {
                    holder.product_price.text =
                        "Rs. " + (items[position].price.toDouble() * 3.00)
                }

            }
        }

我的例外是:-

java.lang.IndexOutOfBoundsException:索引:2,大小:2 在 java.util.ArrayList.get(ArrayList.java:437) 在 com.maruti.marutisabji.adapter.user.ProductAdapter$onBindViewHolder$3.onItemSelected(ProductAdapter.kt:107) 在 android.widget.AdapterView.fireOnSelected(AdapterView.java:944) 在 android.widget.AdapterView.dispatchOnItemSelected(AdapterView.java:933) 在 android.widget.AdapterView.access$300(AdapterView.java:53) 在 android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:898) 在 android.os.Handler.handleCallback(Handler.java:873) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:201) 在 android.app.ActivityThread.main(ActivityThread.java:6820) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:922)

这是我的代码链接请检查:- https://gist.github.com/maulikdadhaniya/c0e16a9a13d03e9b7abe2235a35e7324

【问题讨论】:

  • items 数组包含什么?
  • @TejasPandya 项目包含private var items: ArrayList&lt;ProductListModel&gt;,
  • 它是否包含任何数据?你在哪里填的?
  • 是的,它有 Product Name 、 Price 、 Brand 的数据,并且我在 ProductActivity 中填充了 API 调用,它具有 productAdapter 的产品列表。我的问题代码来自适配器代码@TejasPandya
  • 当我点击 250 gm 和 500 gm 应用程序没有崩溃,但是当我点击 1 Kg 应用程序崩溃时

标签: android kotlin spinner indexoutofboundsexception


【解决方案1】:

您的代码必须以 else 块结尾

【讨论】:

    【解决方案2】:

    我会建议下面的代码块来避免这种IndexOutOfBound 错误:

    我们可以使用AdapterView 来根据位置查找所选项目,而不是直接从数组中访问实体。

    在您的 onItemSelected() 侦听器方法中,

    override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
        // We can retrive selected item from adapter using below approach, so that it never give out of bound error.
        selectedQty = parent?.getItemAtPosition(position) as? String 
        // Your rest of the code of else-if ladder also seems miscellaneous to me
    }
    

    【讨论】:

    【解决方案3】:

    将您的第三个参数名称 onItemSelected position 更改为 pos。因为position 已在您的onBindViewHolder 中使用,并且当您使用items[position] 时,它使用onItemSelectedposition,但您必须使用onBindViewHolderposition 参数。

    override fun onItemSelected(parent: AdapterView<*>?, view: View?, pos: Int, id: Long){
    
        selectedQty = values[pos] // here you should use pos
    
        if (pos == 0) { // need to chnage also here and below conditions
            holder.product_price.text = "Rs. " + (items[position].price.toDouble() * 0.25)
        } else if (pos == 1) {
            holder.product_price.text = "Rs. " + (items[position].price.toDouble() * 0.50)
        } else if (pos == 2) {
            holder.product_price.text = "Rs. " + (items[position].price.toDouble() * 1.00)
        } else if (pos == 3) {
            holder.product_price.text = "Rs. " + (items[position].price.toDouble() * 2.00)
        } else if (pos == 4) {
            holder.product_price.text = "Rs. " + (items[position].price.toDouble() * 3.00)
        }
    }
    

    【讨论】:

    • 没错@Jakir Thanx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 2020-02-01
    相关资源
    最近更新 更多