Получить значения каждого TextField в списке

У меня есть список, который содержит два текстовых поля для каждого элемента. В одно TextField помещается ключ, а в другое — значение. Я хочу получить значения TextFields, например, значения ключа TextField в списке и значения значения TextField в другом списке или получить значения ключей и значений и поместить их в MutableMap (предпочитаю это последнее) но я не знаю, как это сделать.

Как я могу это сделать? Я использую LazyColumn, чтобы показать список TextField. Теперь у меня есть только две переменные, но они всегда имеют одинаковое значение для всех текстовых полей, я хочу иметь разные значения для каждого отдельного текстового поля.

      val keys = remember { mutableStateOf(TextFieldValue()) }
      val values = remember { mutableStateOf(TextFieldValue())}

      LazyColumn(Modifier.fillMaxWidth()){
                   itemsIndexed(myListOfTextFields) { index, item ->
                        Row(Modifier.fillMaxWidth()) {
                           TextField(value = keys.value,
                                     onValueChange = { keys.value = it },
                                     singleLine = true)
                            TextField(value = values.value,
                                      onValueChange = { values.value = it },
                                      singleLine = true)
                   }
      }
1
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из того, что я понял, вы хотите сохранить каждую введенную пару «ключ/значение» из вашего список внутри массива КВ или и карта

Compose предоставляет вам функцию mutableStateListOf, позволяющую вам взаимодействовать с наблюдаемым MutableList в рамках композиции.

Compose также предоставляет вам mutableStateMapOf, но в вашем случае я бы не советовал его использовать, поскольку вы не сможете легко сопоставить ключ/значение с показатель в текстовом поле см. комментарий к коду.

Вот что я бы порекомендовал:

val data = remember { mutableStateListOf<Pair<String, String>>() }

LazyColumn(Modifier.fillMaxWidth()) {
    itemsIndexed(myListOfTextFields) { index, item ->
        val datum = data[index] // can't do this with mutableStateMapOf ??

        Row(Modifier.fillMaxWidth()) {
            TextField(
                value = datum.first,
                onValueChange = { data[index] = data[index].copy(first = it) },
                singleLine = true
            )
            TextField(
                value = datum.second,
                onValueChange = { data[index] = data[index].copy(second = it) },
                singleLine = true
            )
        }
    }
}

Объединение List и Pair в MutableList<Pair<K, V>> дает вам доступ к библиотеке kotlin MutableList<Pair<K, V>>.toMap(), превращая Iterable в Map<K, V>

The returned map preserves the entry iteration order of the original collection. If any of two pairs would have the same key the last one gets added to the map.

Поскольку ваше взаимодействие зависит от итерации, я бы строго придерживался списка и включал его в карту позже, возможно, при отправке данных.

data.toMap()

Другие вопросы по теме