[英]How to transform items in a PagedList?(Android Arch Component Paging Library)
Android Architecture Component 現在引入了Paging Library ,這很棒。
根據官方演示DataSource.Factory
現在支持map
和mapByPage
方法,這意味着我們可以在一個DataSource
轉換項目。
但是DataSource
和DataSource.Factory
應該在model層,而不是Presenter/View層。 然而,很多時候我們想要在我們的 Adapter(對於 RecyclerView 或 ListView)中轉換數據,很明顯,這是 Presentor/View 層邏輯。 現在,一個 Adapter 持有一個PagedList
的實例,但是PageList
不能支持這些操作,有點尷尬。 此外,有時我們想要在PagedList
添加項目或從PagedList
刪除項目。
所以這是一個功能請求:
支持PagedList
上的項目轉換
支持在PagedList
添加/刪除項目
歡迎任何討論。
我認為您需要對PagedList
使用轉換而不是LiveData<List<YourModel>>
。
例如,我有一個Pet
列表,每個Pet
都有gender
。 我需要在運行時顯示Pet
分頁並過濾gender
。
所以,我的 Dao 界面可能是:
@Dao
inteface PetDao {
@Query("SELECT * FROM Pet WHERE Pet.gender = :gender ORDER BY Pet.id ASC")
fun getPetsByGenderDataFactory(gender: String?): Datasource.Factory<Int, Pet>
}
在ViewModel
類中,我將使用Transformations
來過濾LiveData<PagedList<Pet>>
而不是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()
}
}
當用戶改變Pet
gender
時,你只需要更新genderMutableData
值,它就會觸發petItemsData
數據源並更新Pet
項目:
fun updatePetItemsWithNewGender(gender: String?) {
this@PetViewModel.genderMutableData.postValue("female")
}
抱歉,例如我使用 Kotlin 是因為您沒有用 Java 語言標記帖子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.