繁体   English   中英

如何转换 PagedList 中的项目?(Android Arch 组件分页库)

[英]How to transform items in a PagedList?(Android Arch Component Paging Library)

Android Architecture Component 现在引入了Paging Library ,这很棒。

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

但是DataSourceDataSource.Factory应该在model层,而不是Presenter/View层。 然而,很多时候我们想要在我们的 Adapter(对于 RecyclerView 或 ListView)中转换数据,很明显,这是 Presentor/View 层逻辑。 现在,一个 Adapter 持有一个PagedList的实例,但是PageList不能支持这些操作,有点尴尬。 此外,有时我们想要在PagedList添加项目或从PagedList删除项目。

所以这是一个功能请求:

  1. 支持PagedList上的项目转换

  2. 支持在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM