Как выбрать несколько элементов в LazyColumn в JetpackCompose
Как выбрать несколько элементов в LazyColumn и, наконец, добавить выбранные элементы в отдельный список.
GettingTags(tagsContent ={ productTags ->
val flattenList = productTags.flatMap {
it.tags_list
}
Log.i(TAG,"Getting the flattenList $flattenList")
LazyColumn{
items(flattenList){
ListItem(text = {Text(it) })
if(selectedTagItem) {
Icon(
imageVector = Icons.Default.Check,
contentDescription = "Selected",
tint = Color.Green,
modifier = Modifier.size(20.dp)
)
}
}
}
})
Состояние изменяемой переменной
var selectedTagItem by remember{
mutableStateOf(false)
}
1 ответ
Сначала создайте класс с выбранной переменной для переключения
@Immutable
data class MyItem(val text: String, val isSelected: Boolean = false)
Затем создайте SnapshotStateList через mutableStateListOf, который содержит все элементы и может запускать перекомпоновку, когда мы обновляем любой элемент новым экземпляром, а также добавляем или удаляем элементы. Я использовал ViewModel, но это не обязательно. Мы можем переключать элементы с помощью индекса или получать выбранные элементы путем фильтрации.isSelected
флаг
class MyViewModel : ViewModel() {
val myItems = mutableStateListOf<MyItem>()
.apply {
repeat(15) {
add(MyItem(text = "Item$it"))
}
}
fun getSelectedItems() = myItems.filter { it.isSelected }
fun toggleSelection(index: Int) {
val item = myItems[index]
val isSelected = item.isSelected
if (isSelected) {
myItems[index] = item.copy(isSelected = false)
} else {
myItems[index] = item.copy(isSelected = true)
}
}
}
Создайте LazyColumn с ключом, ключ гарантирует, что будут перекомпонованы только обновленные элементы, как видно из документа производительности.
@Composable
private fun SelectableLazyListSample(myViewModel: MyViewModel) {
val selectedItems = myViewModel.getSelectedItems().map { it.text }
Text(text = "Selected items: $selectedItems")
LazyColumn(
verticalArrangement = Arrangement.spacedBy(8.dp),
contentPadding = PaddingValues(8.dp)
) {
itemsIndexed(
myViewModel.myItems,
key = { _, item: MyItem ->
item.hashCode()
}
) { index, item ->
Box(
modifier = Modifier
.fillMaxWidth()
.background(Color.Red, RoundedCornerShape(8.dp))
.clickable {
myViewModel.toggleSelection(index)
}
.padding(8.dp)
) {
Text("Item $index", color = Color.White, fontSize = 20.sp)
if (item.isSelected) {
Icon(
modifier = Modifier
.align(Alignment.CenterEnd)
.background(Color.White, CircleShape),
imageVector = Icons.Default.Check,
contentDescription = "Selected",
tint = Color.Green,
)
}
}
}
}
}
Результат