22

Android Architecture Component 现在引入了Paging Library,非常棒。

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

但是DataSource并且DataSource.Factory应该在模型层,而不是 Presentor/View 层。然而,有很多时候我们想要在我们的 Adapter 中转换数据(对于 RecyclerView 或 ListView),很明显,这是 Presentor/View 层的逻辑。到目前为止,一个 Adapter 拥有一个 的实例PagedList,但PageList不能支持这些操作,这有点尴尬。此外,有时我们还想向/从PagedList.

所以这是一个功能请求:

  1. 支持项目转换PagedList

  2. 支持项目添加/删除到/从PagedList

欢迎任何讨论。

4

1 回答 1

3

我认为您需要使用转换来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()
    }

}

当用户更改genderPet,您只需更新 的值genderMutableData,它将触发数据源petItemsData并更新Pet项目:

fun updatePetItemsWithNewGender(gender: String?) {
    this@PetViewModel.genderMutableData.postValue("female")
}

抱歉,例如,我使用 Kotlin 是因为您没有使用 Java 语言标记帖子。

于 2018-10-27T10:12:14.080 回答