How to transform items in a PagedList?(Android Arch Component Paging Library)
I think you need use transformations for PagedList
instead of LiveData<List<YourModel>>
.
For example, I have a list of Pet
, each Pet
have gender
. I need to show paging of Pet
and filter gender
in runtime.
So, my Dao interface may be:
@Daointeface PetDao { @Query("SELECT * FROM Pet WHERE Pet.gender = :gender ORDER BY Pet.id ASC") fun getPetsByGenderDataFactory(gender: String?): Datasource.Factory<Int, Pet>}
In ViewModel
class, I will use Transformations
to filter LiveData<PagedList<Pet>>
instead of LiveData<List<Pet>>
:
class PetViewModel { private val genderMutableData: MutableLiveData<String> = MutableLiveData() private val petItemsData: LiveData<PagedList<Pet>> = Transformations.switchMap(this@PetViewModel.genderMutableData) { petGender -> LivePagedListBuilder(AppDatabase.getDefault().getPetDao().getPetsByGenderDataFactory(petGender), 20).build() }}
When user change gender
of Pet
, you just update value of genderMutableData
, it will trigger data source for petItemsData
and update Pet
items:
fun updatePetItemsWithNewGender(gender: String?) { this@PetViewModel.genderMutableData.postValue("female")}
Sorry, I'm using Kotlin for example because you don't flag post in Java language.