簡體   English   中英

將惰性列中的項目索引映射到列表中的項目索引

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM