【发布时间】:2019-05-30 05:09:21
【问题描述】:
在我的应用程序中,我喜欢将文件附加到消息中。这些附加文件显示在带有适配器的 RecyclerView 中。 RV 的每个项目都有自己的 btn 用于删除它。问题是当我的列表中有两项并尝试删除一项而不是第二项时,我收到了错误。但是当我尝试删除第 2 项然后第 1 项时,一切正常。我使用调试器并设法找到有问题的行,但我不知道如何解决这个问题。因此,这是适配器中用于从列表中删除项目的代码:
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() 方法抛出了这个异常:
为什么会发生,我该如何解决这个错误。我试图改变这一点:
for (i in 0 until array.size()) 到这个 for (i in 0 until array.size()-1) 并没有用。然后我尝试将此循环更改为for (i in 1 until array.size()),但它也没有帮助。那么,我在哪里犯了错误以及将来如何防止这个问题?
附:很抱歉附上了调试器的截图,因为我无法从中获取文本数据。
【问题讨论】:
-
Java/Kotlin 中的元素编号是
0...length-1所以如果你的数组大小是 10,你可以获得 0...9 个元素。检查您的for (i in 0 until array.size()) {条件 -
您正在从数组中删除一个元素,同时迭代它,因此它的大小会发生变化。尝试直接从 Singleton.array 中删除或复制数组以进行迭代并从原始数组中删除。
-
@Arun,你能检查我的答案吗?也许它会解决我的问题?
-
@VladyslavMatviienko,我看到问题与从数组中删除项目的过程有关,这意味着当我已经删除它的项目时我的循环继续进行,所以我决定使用 break/return from loop当项目被删除时,我的回答显示了这个方法
-
@AndrewGoroshko 我认为只要您只删除一项,您的答案就应该有效。
标签: android arrays kotlin android-recyclerview