android - 为什么在尝试获取 jsonArray 的项目时出现 java.lang.IndexOutOfBoundsException?

标签 android arrays kotlin android-recyclerview

在我的应用程序中,我可以将文件附加到消息中。这些附加文件显示在带有适配器的 RecyclerView 中。 RV 的每个项目都有自己的 btn 用于删除它。问题是当我的列表中有两个项目并尝试删除 1 个项目而不是第 2 个时,我收到错误消息。但是当我尝试删除第二项然后删除第一项时一切正常。我使用调试器并设法找到有问题的行,但我不知道如何解决这个问题。因此,这里是适配器中用于从列表中删除项目的代码:

val array = Singleton.array
if (array!!.size() > 0) {
  for (i in 0 until array.size()) {
   val obj = array.get(i).asJsonObject

   if (obj.get("filename").toString().substring(1, obj.get("filename").toString().length - 1) == mNames[position]) {
   array.remove(obj)
   mNames.removeAt(position)
   Singleton.array = array
   updateNames(mNames)
   }

 }
}

我在这一行有问题:

val obj = array.get(i).asJsonObject

我通过记录器检查了这个变量,一切似乎都正常,我可以用 0 索引获取值。然后我认为问题出在我将数据发送到适配器的地方,但一切正常。我使用调试器并看到该方法 getAsJsonObject() 抛出此异常:

enter image description here

为什么会发生这种情况以及如何解决此错误。我试图改变这个: for (i in 0 until array.size()) 到此 for (i in 0 until array.size()-1) 并且它不起作用。然后我尝试将此循环更改为此 for (i in 1 until array.size()) 并且它也没有帮助。那么,我在哪里犯了错误以及将来如何防止这个问题?

附言抱歉附上调试器的屏幕截图,因为我无法从中获取文本数据。

最佳答案

你从源数组中删除了元素,这就是你得到异常的原因所以使用新数组作为你的过滤值

下面一行的问题

array.remove(obj)

解决方案:

val positionsForRemove = ArrayList<Int>(),
val array = Singleton.array
if (array!!.size() > 0) {
   for (i in 0 until array.size()) {
     val obj = array.get(i).asJsonObject
     if (obj.get("filename").toString().substring(1, obj.get("filename").toString().length - 1) == mNames[position]) 
       positionsForRemove.add(position)
    }
   for(position in positionsForRemove){
          array.remove(position)
          mNames.remove(position)   
        }
  Singleton.array = array
  updateNames(mNames)


}

关于android - 为什么在尝试获取 jsonArray 的项目时出现 java.lang.IndexOutOfBoundsException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56371957/

相关文章:

android - 谷歌播放 : We found Ad SDKs in your application

java - 如何在 Android 上的 RecyclerView 中对列表进行排序

javascript - 给出数组成员变量的名称

java - kotlin的哪个功能可以用来替代通过java代理进行方法拦截

android - 如何将表示类对象的 RecyclerView 项与此类对象绑定(bind)? Kotlin

android - 创建可能不是从 Play 商店安装的应用程序

android - 如何知道设备是左横向还是右横向?

arrays - 在 numpy 数组中每行提取固定数量的元素

ios - 如何在 swift 中初始化像 UILabel 这样的对象数组

使用 Fuel Framework 不显示 Android Toast 消息