可以使用每次返回一个新LiveData的存储库函数从UI刷新的LiveData吗?

时间:2019-09-18 02:44:06

标签: android mvvm android-livedata

我在存储库类中有一个如下方法,该方法从本地数据库或网络中以LiveData的形式返回国家列表:

fun loadCountries(): LiveData<Resource<List<Country>>> {
    return object : NetworkBoundResource<List<Country>, List<CountryResponse>>() {
        ...
    }.asLiveData()
}

在ViewModel中,我有一个LiveData可以保留返回的LiveData:

class CountryViewModel : ViewModel() {

    val countryListResource: LiveData<Resource<List<Country>>> = countryRepository.loadCountries()

    fun refresh() {
        // How to assign new LiveData returned by countryRepository.loadCountries() here?
        // SwitchMap needs other LiveData to be used.
    }
}

用户应该能够刷新数据,这就是我的问题所在。我需要将countryRepository.loadCountries()返回的新LiveData注入countryListResource中,但我不知道该如何实现?

如果我执行countryListResource = countryRepository.loadCountries()(由于它是val,所以我不能这样做),观察者需要停止观察上一个,而开始观察最新的。

如果我在countryListResource上使用swichMap,则需要另一个MutableLiveData来触发来自存储库的新调用,如here所示。

还有其他方法可以实现吗?

1 个答案:

答案 0 :(得分:1)

解决方案非常简单。 首先,在您的存储库类中创建国家列表类型的可变的obj1和不可变的obj2实时数据对象。 Obj2使用obj1初始化。然后loadCountry()函数应仅更新obj1。

您的视图模型应使用observeForever()来观察obj2。 然后视图模型也确实创建了两个与repo相同的obj,分别是obj3和obj4 resp。在您的活动中观察obj4。正在使用postValue()中的observeForever()更新Obj3,并依次更新obj4(由obj3初始化)。

希望这对您有所帮助。

示例:

  

存储库

// obj1
private val _countryLiveData : MutableLiveData<List<Country>>

// obj2
val countryLiveData : LiveData<List<Country>>
        get() = _countryLiveData

fun loadCountries() {
    val list = fetchCountryList()
    _countryLiveData.postValue(list)
}
  

ViewModel

// obj3
private val _countryLiveData : MutableLiveData<List<Country>> 

// obj4  live data to be observed in activity
val countryLiveData : LiveData<List<Country>> 
    get() = _countryLiveData

init {

countryRepository.countryLiveData.observeForever { countryList ->
         this._countryLiveData.postValue(countryList)
   }
}

fun refresh() {
    countryRepository.loadCountries()  
}