簡體   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