Android架构组件现已推出Paging Library,这很棒。
根据官方演示,DataSource.Factory
现在支持map
和mapByPage
方法,这意味着我们可以在一个DataSource
中转换项目。
但DataSource
和DataSource.Factory
应位于模型图层中,而不是呈现者/视图图层。但是,有很多次我们想要在我们的适配器中转换数据(对于RecyclerView或ListView),显然,这是Presentor / View层逻辑。到目前为止,适配器包含PagedList
的实例,但PageList
无法支持这些操作,这有点尴尬。此外,我们仍有时会向PagedList
添加项目或删除项目。
这是一个功能请求:
支持PagedList
支持项目添加/删除PagedList
欢迎任何讨论。
答案 0 :(得分:0)
我认为您需要对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()
}
}
当用户更改gender
的{{1}}时,只需更新Pet
的值,它将触发genderMutableData
的数据源并更新petItemsData
项:< / p>
Pet
抱歉,我使用的是Kotlin,因为您未标记Java语言的帖子。