Я работаю над приложением JetPack Compose, где пользователи могут динамически добавлять и удалять адреса. Я использую Lazycolumn с уникальным ключом (Address.id), но адреса иногда дублируются вместо замены пустого заполнителя. Итак, ранее моя Lazycolumn приняла индекс в качестве ключа, но переоборудование не было сделано, поэтому я использовал идентификатор адреса Intead. Теперь он показывает дубликат идентификатора. Проблема:
При выборе адреса вместо замены пустого заполнителя появляется дубликатная запись.
Lazycolumn бросает исключение (ключ «0» уже использовался), даже если я гарантирую уникальные идентификаторы. BR /> Список _Addresses в моем просмотре, кажется, содержит дубликаты. < /p>
LazyColumn(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
item {
Text(
"Add stops",
style = MaterialTheme.typography.titleMedium,
modifier = Modifier.padding(16.dp)
)
}
itemsIndexed(
items = addresses,
key = { index, address -> address.id } // using unique ID as key
) { index, address ->
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier
.padding(vertical = 8.dp)
.fillMaxWidth()
) {
Text(
text = (index + 1).toString(),
style = MaterialTheme.typography.bodyMedium,
modifier = Modifier.padding(end = 8.dp)
)
AddressSearchBox(index, address.address, viewModel)
IconButton(
onClick = {
Log.d("RemoveAddress", "Removing address with ID: ${address.id}")
viewModel.removeAddress(address.id)
},
modifier = Modifier.padding(start = 8.dp)
) {
Icon(
Icons.Default.Close,
contentDescription = "Delete Address",
tint = MaterialTheme.colorScheme.error
)
}
}
}
item {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
horizontalArrangement = Arrangement.Center
) {
TextButton(onClick = { viewModel.addAddress() }) {
Icon(Icons.Default.Add, contentDescription = "Add stop")
Text("Add stop")
}
}
}
item {
Button(
onClick = { },
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
) {
Text("Done")
}
}
}
}
< /code>
@HiltViewModel
class HomeViewModel @Inject constructor(
private val addressRepository: AddressRepository,
private val placesRepository: PlacesRepository,
private val latLongRepository: LatLongRepository
): ViewModel() {
val suggestions = mutableStateOf(emptyList())
var activeIndex: Int? = null
private val addressesMutex = Mutex()
private val _addresses = MutableStateFlow(emptyList())
val addresses: StateFlow = _addresses
fun addAddress() {
_addresses.value += Address(address = "")
}
fun removeAddress(id: Long) {
Log.d("RemoveAddress", "Removing address with ID: $id")
_addresses.value = _addresses.value.filter { it.id != id }
UnmarkSelected(id)
}
fun selectOrAddAddress(address: String) = viewModelScope.launch {
addressesMutex.withLock{
val existingAddress = addressRepository.getAddressIfExists(address)
if (existingAddress != null) {
addressRepository.markAddressSelected(existingAddress.id)
} else {
val latLng = fetchLatLong(address)
latLng?.let {
val newAddress = Address(address = address, latitude = it.latitude, longitude = it.longitude)
val insertedId = addressRepository.insertAddress(newAddress)
addressRepository.markAddressSelected(insertedId)
val updatedList = _addresses.value.toMutableList()
val placeholderIndex = updatedList.indexOfFirst { it.id.toInt() == 0 && it.address.isEmpty() }
if (placeholderIndex != -1) {
updatedList[placeholderIndex] = newAddress.copy(id = insertedId)
} else {
updatedList.add(newAddress.copy(id = insertedId))
}
_addresses.value = updatedList
}
}
}
}
< /code>
Ensured _addresses does not contain duplicates before updating
Expected: No duplicate addresses should appear in LazyColumn.
Result: Duplicates still appeared, even though logs showed _addresses updating correctly.
Used distinctBy { it.address } in LazyColumn
Expected: Prevent duplicate UI elements when the same address is added multiple times.
Result: The issue persisted, and some addresses were still duplicated.
Подробнее здесь: https://stackoverflow.com/questions/794 ... being-used
Android dev (Kotlin и Jetpack) Lazycolumn Duplicate используется ключ ⇐ Android
Форум для тех, кто программирует под Android
1740083117
Anonymous
Я работаю над приложением JetPack Compose, где пользователи могут динамически добавлять и удалять адреса. Я использую Lazycolumn с уникальным ключом (Address.id), но адреса иногда дублируются вместо замены пустого заполнителя. Итак, ранее моя Lazycolumn приняла индекс в качестве ключа, но переоборудование не было сделано, поэтому я использовал идентификатор адреса Intead. Теперь он показывает дубликат идентификатора. Проблема:
При выборе адреса вместо замены пустого заполнителя появляется дубликатная запись.
Lazycolumn бросает исключение (ключ «0» уже использовался), даже если я гарантирую уникальные идентификаторы. BR /> Список _Addresses в моем просмотре, кажется, содержит дубликаты. < /p>
LazyColumn(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
item {
Text(
"Add stops",
style = MaterialTheme.typography.titleMedium,
modifier = Modifier.padding(16.dp)
)
}
itemsIndexed(
items = addresses,
key = { index, address -> address.id } // using unique ID as key
) { index, address ->
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier
.padding(vertical = 8.dp)
.fillMaxWidth()
) {
Text(
text = (index + 1).toString(),
style = MaterialTheme.typography.bodyMedium,
modifier = Modifier.padding(end = 8.dp)
)
AddressSearchBox(index, address.address, viewModel)
IconButton(
onClick = {
Log.d("RemoveAddress", "Removing address with ID: ${address.id}")
viewModel.removeAddress(address.id)
},
modifier = Modifier.padding(start = 8.dp)
) {
Icon(
Icons.Default.Close,
contentDescription = "Delete Address",
tint = MaterialTheme.colorScheme.error
)
}
}
}
item {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
horizontalArrangement = Arrangement.Center
) {
TextButton(onClick = { viewModel.addAddress() }) {
Icon(Icons.Default.Add, contentDescription = "Add stop")
Text("Add stop")
}
}
}
item {
Button(
onClick = { },
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
) {
Text("Done")
}
}
}
}
< /code>
@HiltViewModel
class HomeViewModel @Inject constructor(
private val addressRepository: AddressRepository,
private val placesRepository: PlacesRepository,
private val latLongRepository: LatLongRepository
): ViewModel() {
val suggestions = mutableStateOf(emptyList())
var activeIndex: Int? = null
private val addressesMutex = Mutex()
private val _addresses = MutableStateFlow(emptyList())
val addresses: StateFlow = _addresses
fun addAddress() {
_addresses.value += Address(address = "")
}
fun removeAddress(id: Long) {
Log.d("RemoveAddress", "Removing address with ID: $id")
_addresses.value = _addresses.value.filter { it.id != id }
UnmarkSelected(id)
}
fun selectOrAddAddress(address: String) = viewModelScope.launch {
addressesMutex.withLock{
val existingAddress = addressRepository.getAddressIfExists(address)
if (existingAddress != null) {
addressRepository.markAddressSelected(existingAddress.id)
} else {
val latLng = fetchLatLong(address)
latLng?.let {
val newAddress = Address(address = address, latitude = it.latitude, longitude = it.longitude)
val insertedId = addressRepository.insertAddress(newAddress)
addressRepository.markAddressSelected(insertedId)
val updatedList = _addresses.value.toMutableList()
val placeholderIndex = updatedList.indexOfFirst { it.id.toInt() == 0 && it.address.isEmpty() }
if (placeholderIndex != -1) {
updatedList[placeholderIndex] = newAddress.copy(id = insertedId)
} else {
updatedList.add(newAddress.copy(id = insertedId))
}
_addresses.value = updatedList
}
}
}
}
< /code>
Ensured _addresses does not contain duplicates before updating
Expected: No duplicate addresses should appear in LazyColumn.
Result: Duplicates still appeared, even though logs showed _addresses updating correctly.
Used distinctBy { it.address } in LazyColumn
Expected: Prevent duplicate UI elements when the same address is added multiple times.
Result: The issue persisted, and some addresses were still duplicated.
Подробнее здесь: [url]https://stackoverflow.com/questions/79455768/android-dev-kotlin-and-jetpack-lazycolumn-duplicate-key-being-used[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия