I have a list of accounts, and when i make the long click, I want to remove the item from the arraylist. I'm trying to remove it from a alertdialog, but i'm getting the ConcurrentModificationException. This is where is crashing:
listAccounts.forEachIndexed { index, account -> if (idParamether == account.id) { listAccounts.remove(account) } }
ConcurrentModificationException is not thrown by Iterator. remove() because that is the permitted way to modify an collection while iterating.
The ConcurrentModificationException generally occurs when working with Java Collections. The Collection classes in Java are very fail-fast and if they are attempted to be modified while a thread is iterating over it, a ConcurrentModificationException is thrown.
That's a common problem with the JVM, if you want to remove an item from a collection while iterating through it, you need to use the Iterators
exemple:
val myCollection = mutableListOf(1,2,3,4) val iterator = myCollection.iterator() while(iterator.hasNext()){ val item = iterator.next() if(item == 3){ iterator.remove() } }
this will avoid ConcurrentModificationExceptions
I hope this answered your question, have a good day
Edit: you can find another explanation here, even if it is Java code the problem is the same
Edit n°2 the anwser of leonardkraemer show you a more kotlin-friendly way to do so
In Kotlin you can use removeIf{ predicate }
. Which is a shorthand to using the Iterator
. Full statement:
listAccounts.removeIf{ it == account.id }
for the explanation see Iterating through a Collection, avoiding ConcurrentModificationException when removing objects in a loop
Update: Kotlin-stdlib introduced removeAll { predicate }
which, as Aguragorn pointed out in his answer, does the same and can be used if removeIf
is not present on your runtime environment (i.e. Java 1.6 or Android pre API level 24).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With