android - 列表的第二项未显示
问题描述
这是我的视图模型代码:
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 文本的这部分不起作用,列表中的第二项存在,但文本没有显示`
谢谢你
解决方案
当您调用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()}"
}
}
})
推荐阅读
- java - 设置背景颜色时回收站视图不显示视图
- python - Python Eve 中嵌套字段的投影
- android - React Native ScrollView 裁剪 Android Landscape 上的最后一个元素
- asp.net - .NET - SelectedRow 不返回任何值
- c# - c#文本框显示对象名称而不是值
- r - 在我的 R 代码中观察到异常的逻辑不一致
- javascript - 如何在 React 中访问组件方法?
- python-3.x - 如何在 mac Os 中将 openCv 与 Python3 链接起来
- javascript - 知道数组的 jqXHR 何时全部完成
- java - 如何在 Linux 操作系统中从 Java 调用“Powershell 脚本文件”