如何从另一个类更新LiveData <List>?

问题描述

因此,我的ViewModel中有一个列表,每当发生更改时,它们就会通过DataBinding反映在UI上。

private val _entries = MutableLiveData<List<BarEntry>>()
val entries: LiveData<List<BarEntry>>
    get() = _entries

ISortingAlgorithm是表示排序算法的接口。

interface ISortingAlgorithm
{
    fun sort(listToSort: List<BarEntry>)
}

实现ISortingAlgorithm的具体类的示例(而非最终实现):

class BubbleSort : ISortingAlgorithm
{
    override fun sort(listToSort: List<BarEntry>)
    {
        Log.d(this::class.java.canonicalName,"Applying sort")

        for(currentPass in 0 until (listToSort.size - 1))
        {
            for(currentPosition in 0 until (listToSort.size - currentPass - 1))
            {
                if(listToSort[currentPosition].y > listToSort[currentPosition + 1].y)
                {
                    val temp = listToSort[currentPosition].y
                    listToSort[currentPosition].y = listToSort[currentPosition+1].y
                    listToSort[currentPosition+1].y = temp
                }
                Thread.sleep(10)
            }
        }
    }
}

在我的ViewModel中,我有一个lateinit var sortingAlgorithm: ISortingAlgorithm。当我调用sortingAlgorithm.sort(_entries.value)时,我希望UI在每个步骤中反映对列表所做的所有修改,而不仅仅是最终结果。该怎么办?

我现在的解决方案是让sort()返回列表的所有中间状态,然后将更改应用于视图模型中的原始LiveData列表,但这似乎是一种解决方法,而不是解决方案。

解决方法

在ViewModel中使用Kotlin扩展构建LiveData。

lateinit var sorter: ISortingAlgorithm

fun getLiveData(listToSort: List<BarEntry>)
        : LiveData<List<BarEntry>> = androidx.lifecycle.liveData {
    emit(listToSort)
    while (sorter.sort(listToSort)) 
        emit(listToSort)
}
可以修改

sort()以返回一个布尔值,该布尔值指示是否刚刚发生排序步骤。无法执行步骤时,排序终止。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...