Код: Выделить всё
data class CardsState(val cards: ImmutableList)
data class Card(
val header: String,
val items: ImmutableList,
)
Пока все хорошо.
Но иногда мне нужно перейти к определенному элементу CardItem. К сожалению, я не могу использовать функцию LazyListState.animateScrollToItem(index: Int), поскольку она принимает индекс элемента в качестве параметра, и я не могу сказать, какой индекс элемента lazyColumn мне нужен, поскольку его может быть сложно вычислить.
Лучше всего для меня было бы иметь LazyListState.animateScrollToItem(key: Any), поскольку все мои элементы LazyColumn имеют уникальный ключ, который я могу передать в качестве параметра своему состоянию следующим образом:
Код: Выделить всё
interface CollectionItem {
val key: Any?
}
fun CollectionItem.makeKey(): String = buildString {
append(javaClass.name)
key?.let { append("_$it") }
}
data class CardsState(
val cards: ImmutableList,
val scrollToItemWithKey: Any?, // The key of the lazyColumn item I want to scroll to
)
data class Card(
val header: String,
val items: ImmutableList,
) : CollectionItem {
override val key: String = header
}
sealed class CardItem : CollectionItem {
data class CardItemTypeA(/* some parameters */) : CardItem()
data class CardItemTypeB(/* some others*/) : CardItem()
}
@Composable
fun MyContent(cardsState: CardsState) {
val scrollState = rememberLazyListState()
LazyColumn(state = scrollState) {
cardsState.cards.forEach { card ->
item(key = "${card.makeKey()}_top") { Spacer(modifier = Modifier.height(16.dp)) }
item(key = "${card.makeKey()}_header") { Header(card.header) }
items(items = card.items, key = { it.makeKey() }) {
when (it) {
is CardItem.CardItemTypeA -> ComposeCardItemTypeA()
is CardItem.CardItemTypeB -> ComposeCardItemTypeB()
}
item(key = "${card.makeKey()}_bottom") { CardBottomLayout() }
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... item-index