I have this ViewModel
that gets a list from the network and I populate a RecyclerView
with the data (MyAvailabilityRepository
returns a MutableLiveData
, that's why i'm using Transformations.switchMap
):
class MyAvailabilityViewModel : ViewModel() {
private val getListsParams = MutableLiveData<String>()
private val getListsObservable = Transformations.switchMap(getListsParams) {
organizationId -> MyAvailabilityRepository.getSectionedLists(organizationId)
}
fun getListsObservable() : LiveData<Resource<MutableList<SectionedAvailabilityList>>> {
return getListsObservable
}
fun fetchLists(organizationId: String, forceRefresh: Boolean = false) {
if (getListsParams.value == null || forceRefresh) {
getListsParams.value = organizationId
}
}
}
Fragment's onActivityCreated
:
override fun onActivityCreated(savedInstanceState: Bundle?) {
...
viewModel.getListsObservable().observe(this, Observer { // populate RecyclerView })
viewModel.fetchLists(organizationId)
}
Since getListParams.value
is null the first time, it will set getListsParams.value = organizationId
and trigger the switchMap
and call the repository to get the list from the network.
When I want to force a refresh (by pull-to-refresh) and call the network again, I can use forceRefresh = true
:
override fun onRefresh() {
viewModel.fetchLists(organizationId, forceRefresh = true)
}
It will set the value of organizationId
and trigger the Transformations that will then call network.
But, I have a scenario where I clear the data from my RecyclerView's adapter. If after that, the user click a button, I would like to trigger the observer again so that I re-populate the adapter with the data that the getListsObservable has already fetched. I don't want to call forceRefresh on this one cause i'm sure I already have the data and I would just like to trigger the observer again so that my UI is updated with the existing data. Since getListParams.value
is not null at that point, then nothing happens when I call fetchLists(organizationId)
later on.
Any idea of how I could achieve that with my current setup?