该代码在 Java 中有效,但当转换为 Kotlin 时,它不再有效。它抛出一个 IndexOutOfBoundsException
。
这是原始的 Java:
grid_view.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
String selectedItem = ((TextView) view.findViewById(R.id.tag_name)).getText().toString();
for (int j = 0; j < itemList.size(); j++){
String tempString = itemList.get(j);
if(tempString.equals(selectedItem)) {
Log.d("Update", "Removing: " + selectedItem);
itemList.remove(j);
}
}
}
});
这是新的 Kotlin:
grid_view!!.onItemClickListener = AdapterView.OnItemClickListener { _, _, _, _ ->
val selectedItem = (tag_name as TextView).text.toString()
itemList.indices.forEach {
val tempString = itemList[it]
if (tempString == selectedItem) {
Log.d("Update", "Removing: " + selectedItem)
itemList.removeAt(it)
}
}
}
最佳答案
由于 indices
是第一次初始化的,所以 forEach
操作的 indices
在你从 List
,但是size()
在Java中改变了,例如:
// v--- `size` is changed after remove item from List
for (int j = 0; j < itemList.size(); j++){
//...
}
对于 Kotlin 中的可变操作,请使用 MutableCollection#removeIf/MutableCollection#removeAll相反,例如:
itemList.removeIf { it == selectedItem } // java-8
itemList.removeAll { it == selectedItem } // Kotlin
AND 您的 Java 代码逻辑错误,例如:
for (int j = 0; j < itemList.size(); j++){
String tempString = itemList.get(j);
if(tempString.equals(selectedItem)) {
itemList.remove(j--);
// ^
// you should minus the current j, if don't the next is skipped
}
}
关于java - 从列表中删除会在迭代 : Java->Kotlin 时抛出 IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45172975/