Android Compose: принудительно свернуть все развернутые карточки, кроме выбранных в данный момент

В настоящее время я работаю над списком расширяемых карт. Я хотел бы закрыть все другие открытые расширяемые карты, кроме выбранной в данный момент.

Данные, с которыми я работаю, представляют собой Map<String, String>, однако я не знаю, как получить ссылку на список элементов в списке, чтобы перебрать его и закрыть все остальные, ожидая текущего. Любые предложения будут очень полезны!

      val size = viewModel.getQuestionsAndAnswers(groupName).size
            Column {
                var i = 0
                for(question in viewModel.getQuestionsAndAnswers(groupName)) {
                    ExpandableCard(
                        title =  question.key,
                        description = question.value,
                        position = i++,
                        onExpandableCardClicked = {
                            // question: how do I loop over all the items in expandable cards and close them.
                        }
                    )
                }
            }

1 ответ

У вас может быть состояние, которое информирует об индексе текущей открытой карты:

      val selectedIndexState = rememberSaveable {
        mutableStateOf(-1)
    }

А затем добавьте isExpandedаргумент в пользу ExpandableCard:

      ExpandableCard(
    title = question.key,
    description = question.value,
    position = i++,
    isExpanded = selectedIndexState.value == i,
    onExpandableCardClicked = {
        selectedIndexState.value = i
    }
)

Вы также можете рассмотреть возможность использования LazyColumnпри работе с такими списками:

      val selectedIndexState = rememberSaveable {
    mutableStateOf(-1)
}
LazyColumn {
    itemsIndexed(
        items = viewModel.getQuestionsAndAnswers(groupName).toList()
    ) { index, question ->
        ExpandableCard(
            title = question.first,
            description = question.second,
            position = index,
            isSelected = selectedIndexState.value == index,
            onExpandableCardClicked = {
                selectedIndexState.value = index
            }
        )
    }
}
Другие вопросы по тегам