java - 从列表中删除会在迭代 : Java->Kotlin 时抛出 IndexOutOfBoundsException

标签 java android kotlin

该代码在 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/

相关文章:

java - 为什么我的 OpenGL 代码失败了?

android - AsyncStorage 数据在 Android 设备上的物理位置在哪里?

exception - kotlin协程,launch如何处理异常

java - 返回泛型列表时转换对象

java - Thread.sleep() 替代方案

Java 同步函数在回调上解锁

android - 屏幕方向 - 反向纵向

java - Kotlin 中的哪些语言功能可能导致内存泄漏?

java - Android 通过 kotlin 返回非空字体

java - 使用 Java 将 POST 转换为 Json