【问题标题】:How can I update LiveData<List> from another class?如何从另一个类更新 LiveData<List>?
【发布时间】:2020-09-29 15:09:49
【问题描述】:

所以我的 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 列表,但这似乎是一种解决方法而不是解决方案。

【问题讨论】:

  • 贴出SortingAlgorithm的内容
  • 编辑了原帖。

标签: android kotlin android-livedata


【解决方案1】:

在 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() 可以修改为返回一个布尔值,指示是否刚刚发生了排序步骤。当一个步骤不能发生时,排序终止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多