Cha*_*son 3 animation android-diffutils android-jetpack-compose lazycolumn
在具有多个项目类型的惰性列或行中设置插入和删除动画的最佳方法是什么,类似于使用 DiffUtil 的方式?
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()
}
Run Code Online (Sandbox Code Playgroud)
内部视图模型:
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
}
Run Code Online (Sandbox Code Playgroud)
可组合列表:
@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)
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7621 次 |
| 最近记录: |