簡體   English   中英

刪除某些項目后,LazyColumn 項目保持在同一位置

[英]LazyColumn items stay in same position after some items removed

我有帶滑動刪除功能的 LazyColumn。 當我滑動一個項目時,它會被 viewModel 刪除。 問題是,如果我將項目滑開,LazyColumn 不會更新其他項目的位置(如 GIF 所示)。

在此處輸入圖像描述

這是我的代碼實現:

@ExperimentalMaterialApi
@Composable
fun Screen() {
    val livedata = viewModel.itemsLiveData.observeAsState()
    val stateList = remember { mutableStateListOf<Data>() }

    stateList.addAll(livedata.value!!)
    SwipableLazyColumn(stateList)
}

@ExperimentalMaterialApi
@Composable
fun SwipableLazyColumn(
    stateList: SnapshotStateList<Data>
) {
    LazyColumn {
        items(items = stateList) { item ->
            val dismissState = rememberDismissState()
            if (dismissState.isDismissed(EndToStart) || dismissState.isDismissed(StartToEnd)) {
                viewModel.swipeToDelete(item)
            }
            SwipeToDismiss(
                state = dismissState,
                directions = setOf(StartToEnd, EndToStart),
                dismissThresholds = {
                    FractionalThreshold(0.25f)
                },
                background = {},
                dismissContent = {
                    MyData(item)
                }
            )
        }
    }
}

我按照此處的建議使用SnapshotStateList 雖然我不使用swapList因為它會清除所有項目

視圖模型

    class MyViewModel @Inject internal constructor(
    private val itemRepository: ItemRepository
) : BaseViewModel(), LifecycleObserver {

    private val itemsList = mutableListOf<MyData>()

    private val _itemsLiveData = MutableLiveData<List<MyData>>()
    val itemsLiveData: LiveData<List<MyData>> = _itemsLiveData

    init {
        loadItems()
    }

    private fun loadItems() {
        viewModelScope.launch {
            itemRepository.getItems().collect {
                when (it) {
                    is Result.Success -> onItemsLoaded(it.data)
                    is Result.Error -> {
                        onItemsLoaded(emptyList())
                    }
                }
            }
        }
    }

    private fun onItemsLoaded(itemsList: List<MyData>) {
        itemsList.clear()
        itemsList.addAll(notifications)

        _itemsLiveData.value = if (itemsList.isNotEmpty()) {
            itemsList
        } else {
            null
        }
    }

    fun swipeToDelete(item: MyData) {
        if (itemsList.size == 0) return
        viewModelScope.launch {
            when (
                val result =
                    itemRepository.deletelItem(item)
            ) {
                is Result.Success -> {
                    onItemDeleted(item)
                }
                is Result.Error -> {
                    showSnackBar(
                        "error"
                    )
                }
            }
        }
    }

    private fun onItemDeleted(item: MyData) {
        itemsList.remove(item)
        _itemsLiveData.value = itemsList
    }
}

您需要為LazyColumnitems提供key

默認情況下,每個項目的 state 與列表中項目的 position 鍵控。 但是,如果數據集更改,這可能會導致問題,因為更改 position 的項目實際上會丟失任何記住的 state。

例子

LazyColumn {
    items(
        items = stateList,
        key = { _, listItem ->
            listItem.hashCode()
        },
    ) { item ->
        // As it is ...
    }
}

參考

您應該在 viemodel 中刷新列表(刪除項目)並在此處返回修改后的列表

var tempList = itemList
ItemList.clear() 
ItemList.addAll(tempList)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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