How to transform items in a PagedList?(Android Arch Component Paging Library) How to transform items in a PagedList?(Android Arch Component Paging Library) android android

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.