[英]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.