Как добавить новый элемент в определенный индекс? - PullRequest
0 голосов
/ 14 мая 2018

Я новичок в kotlin, я хочу обновить элемент в списках. Я использую этот код:

var index: Int
    for (record in recordList)
        if (record.id == updatedHeader?.id) {
            index = recordList.indexOf(record)
            recordList.add(index, updatedHeader)
        }

но он не может этого сделать из-за ConcurrentModificationException

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Если в списке есть одна запись с указанным id, вы можете найти ее индекс и добавить заголовок с этим индексом:

    val index = recordList.indexOfFirst { it.id == updatedHeader.id }
    if (index >= 0)
        recordList.add(index, updatedHeader)

Если существует несколько записей с данным идентификатором и вы хотите добавить заголовок перед каждой из них, вы можете использовать get listIterator и использовать его методы для изменения списка во время итерации без получения ConcurrentModificationException:

    val iterator = recordList.listIterator()
    for (record in iterator) {
        if (record.id == updatedHeader.id) {
            iterator.previous()  // move to the position before the record
            iterator.add(updatedHeader) // prepend header
            iterator.next() // move next, back to the record
        }
    }
0 голосов
/ 14 мая 2018

Предполагая, что recordList - это MutableList и val (то есть вы хотите изменить записи на месте), вы можете использовать forEachIndexed, чтобы найти записи, которые вам нужны, и заменить их.

Это не вызвало ConcurrentModificationException:

recordList.forEachIndexed { index, record -> 
    if(record.id == updatedHeader?.id) recordList[index] = updatedHeader
}

С другой стороны, если вы переопределите recordList как неизменяемый список и переменную, вы можете переписать весь список, используя map:

recordList = recordList.map { if(it.id == updatedHeader?.id) updatedHeader else it }

Конечно, вы можете позвонить .toMutableList() по окончании этого, если хотите превратить ваш List в MutableList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...