在具有多个项类型的惰性列或行中动画插入和删除动画的最佳方法是什么,类似于使用DiffUtil的方式?
发布于 2022-06-07 21:57:13
https://issuetracker.google.com/issues/150812265
Modifier.animateItemPlacement()就是为此创建的,但是使用多个项类型来实现它就不那么直接了。
动画演示:https://youtube.com/shorts/FBwMV1HoAoQ?feature=share
Ps (供演示)
密封级:
sealed class CartListItems(open val id: String = "") {
class RewardHeaderItem(override val id: String, val title: String) : CartListItems()
class RewardListItem(override val id: String, val rewards: List<RewardItem>) : CartListItems()
class CartHeaderItem(override val id: String, val title: String) : CartListItems()
class CartListItem(override val id: String, val cartItem: CartItem) : CartListItems()
}在ViewModel内部:
val cartListItems: StateFlow<List<CartListItems>> =
combine(
rewardItems,
cartItems
) { rewardItems, cartItems ->
buildCartList(rewardItems, cartItems)
}.stateIn(
scope = viewModelScope,
started = Eagerly,
initialValue = emptyList()
)
private fun buildCartList(rewardItems: List<RewardItem>, cartItems: List<CartItem>): List<CartListItems> {
val items = ArrayList<CartListItems>()
if (rewardItems.isNotEmpty()) {
items.add(
CartListItems.RewardHeaderItem("rewards-header", "Your Rewards")
)
items.add(
CartListItems.RewardListItem("rewards-list", rewardItems)
)
}
if (cartItems.isNotEmpty()) {
items.add(
CartListItems.CartHeaderItem("cart-header", "Your Cart")
)
items.addAll(
cartItems.map { CartListItems.CartListItem("cart-item:${it.id}", it) }
)
}
return items
}可合并的列表:
@Composable
private fun CartList(
cartViewModel: CartViewModel = viewModel()
) {
val listItems by cartViewModel.cartListItems.collectAsState()
LazyColumn(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
contentPadding = PaddingValues(vertical = 16.dp),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
items(listItems, key = { it.id }) { listItem ->
when (listItem) {
is CartListItems.RewardHeaderItem -> {
Box(modifier = Modifier.animateItemPlacement()) {
RewardsHeader()
}
}
is CartListItems.RewardListItem -> {
Box(modifier = Modifier.animateItemPlacement()) {
RewardsList(listItem.rewards)
}
}
is CartListItems.CartHeaderItem -> {
Box(modifier = Modifier.animateItemPlacement()) {
CartHeader()
}
}
is CartListItems.CartListItem -> {
Box(modifier = Modifier.animateItemPlacement()) {
CartItem(listItem.cartItem)
}
}
}
}
}
}https://stackoverflow.com/questions/72537949
复制相似问题