[英]Map item index in lazy column to item index in list
所以我有一個類似於所附代碼片段的市場列表。 我們在視圖模型中有一個市場項目列表被觀察為我們的狀態。 我們將每個市場項目分解為一個惰性項目(附帶問題,這是否提高了性能,比方說一列,將所有可組合項批量化為一個?)。
我的問題是一種將每個惰性項的實際索引映射到感知項索引的方法,理想情況下不向每個可組合子項提供惰性列表狀態(為了可重用性和/或性能)。 在以下示例中,如果我的列表中有兩個市場項目,第二個沒有任何 mediaData,則地圖應具有以下內容:
0 -> 0
1 -> 0
2 -> 0
3 -> 0
4 -> 1
5 -> 1
6 -> 1
// this is the state value I want to fill as the lazycolumn gets built
var perceivedIndexMapper by remember { mutableStateOf(mapOf<Int, Int>()) }
var listState = rememberLazyListState()
val marketplaceItems by viewModel.items.collectAsState() // List items flow
LazyColumn(
state = listState
) {
marketplaceItems.forEachIndexed { marketplaceItem, index ->
item {
Header(marketplaceItem.headerData, index)
}
item {
Body(marketplaceItem.bodyData, index)
}
// Some marketplace items don't have media
marketplaceItem.mediaData?.let {
item {
Media(marketplaceItem.mediaData, index)
}
}
item {
Footer(marketplaceItem.footerData, index)
}
}
}
檢查這個
// this is the state value I want to fill as the lazycolumn gets built
var perceivedIndexMapper by remember { mutableStateOf(mapOf<Int, Int>())}
var listState = rememberLazyListState()
val marketplaceItems by viewModel.items.collectAsState()
LazyColumn(
state = listState
) {
itemsIndexed(marketplaceItems) { index, item ->
Header(marketplaceItem.headerData, index)
Body(marketplaceItem.bodyData, index)
item.mediaData?.let {
Media(marketplaceItem.mediaData, index)
perceivedIndexMapper.put(index, 0)
}
Footer(marketplaceItem.footerData, index)
if(item.mediaData == null) {
perceivedIndexMapper.put(index, 1)
}
}
}
筆記
您應該確切了解 LazyList 的工作原理。 上面的代碼將根據您的需要顯示盡可能多的產品,並滿足您設置的條件。 每個產品有一個索引,其中 0 個地圖值用於媒體,1 個沒有媒體。 此外,您應該在另一個可組合函數中獲取此可變狀態以供重用(狀態提升)
我希望,我幫助了你
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.