首页 > 解决方案 > 列表的第二项未显示

问题描述

这是我的视图模型代码:

    val workout = state.get<Workout>("workout")
    
    var steps : List<Step> = emptyList()

    fun  getSteps() = viewModelScope.launch {
        steps = workout?.let { stepDao.getWorkoutSteps(it.workoutId) }!!
        Log.e("KEK", steps.size.toString())
    }

和片段:

        viewModel.getSteps()

        if (viewModel.steps.isNotEmpty()) {
            binding.apply {
                currentStepName.text = viewModel.steps[0].name
                currentStepDuration.text = viewModel.steps[0].length.toString()
                nextStep.text = "${viewModel.steps[1].name} : ${viewModel.steps[1].length.toString()}"
            }
        }

我填充 nextStep 文本的这部分不起作用,列表中的第二项存在,但文本没有显示`

谢谢你

标签: androidkotlinandroid-room

解决方案


当您调用viewModel.getSteps()它时,它会启动一个协程,因此您需要等待它完成。但是您不要等待并尝试使用viewModel.steps可能尚未更新的 UI 来更新 UI,因为协程可能尚未启动。

在您的情况下,您可以使用LiveData对象来解决问题。

在你的ViewModel


val liveSteps: MutableLiveData<List<Step>> = MutableLiveData()

fun  getSteps() = viewModelScope.launch {
        steps = workout?.let { stepDao.getWorkoutSteps(it.workoutId) }!!
        liveSteps.postValue(steps)
        Log.e("KEK", steps.size.toString())
    }

现在LiveData在 Fragment 中观察并更新 UI

viewModel.liveSteps.observe(viewLifeCycleOwner, androidx.lifecycle.observe{
    if(!(it.isNullOrEmpty()) && it.size == 2){
        binding.apply {
                currentStepName.text = it[0].name
                currentStepDuration.text = it[0].length.toString()
                nextStep.text = "${it[1].name} : ${it[1].length.toString()}"
            }
    }
})

推荐阅读