问题描述
因此,我的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()
以返回一个布尔值,该布尔值指示是否刚刚发生排序步骤。无法执行步骤时,排序终止。