如何转换PagedList中的项目?(Android Arch Component Paging Library)

时间:2018-04-27 08:57:53

标签: android paging android-architecture-components android-paging

Android架构组件现已推出Paging Library,这很棒。

根据官方演示,DataSource.Factory现在支持mapmapByPage方法,这意味着我们可以在一个DataSource中转换项目。

DataSourceDataSource.Factory应位于模型图层中,而不是呈现者/视图图层。但是,有很多次我们想要在我们的适配器中转换数据(对于RecyclerView或ListView),显然,这是Presentor / View层逻辑。到目前为止,适配器包含PagedList的实例,但PageList无法支持这些操作,这有点尴尬。此外,我们仍有时会向PagedList添加项目或删除项目。

这是一个功能请求:

  1. 支持PagedList

  2. 上的项目转换
  3. 支持项目添加/删除PagedList

  4. 欢迎任何讨论。

1 个答案:

答案 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语言的帖子。