【问题标题】:How to transform items in a PagedList?(Android Arch Component Paging Library)如何转换 PagedList 中的项目?(Android Arch 组件分页库)
【发布时间】:2018-04-27 08:57:53
【问题描述】:

Android 架构组件现在引入了Paging Library,这很棒。

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

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

所以这是一个功能请求:

  1. 支持PagedList上的项目转换

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

欢迎任何讨论。

【问题讨论】:

  • 我认为Domain模型不是主要问题,你可以只把PagedList当作一个领域类,抽象出数据层的工厂和数据源。我看到的问题是当您需要在表示层中进行转换时。 (假设拱层为数据域表示)

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


【解决方案1】:

我认为您需要对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&lt;PagedList&lt;Pet&gt;&gt;而不是LiveData&lt;List&lt;Pet&gt;&gt;

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()
    }

}

当用户更改Petgender 时,只需更新genderMutableData 的值,就会触发petItemsData 的数据源并更新Pet 项:

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

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

【讨论】:

  • 添加新宠物怎么样?如何使用该新宠物触发 PagedListAdapter 更新?
  • @Slim_user71169 这取决于您的 Dao 方法的返回类型。对于LiveData,Datasource.Factory&lt;Int, Model&gt;,...数据源会在模型更新时自动触发变化。
  • 我不认为你在上面做的是一个转换。重点是从数据库中拉出一个 Model_A 的 PagedList 并将其转换为 ViewModel 中的 LiveData>。有没有这样的例子?
  • 这不是转型! OP 的要求是,与其通过submitListPagedList&lt;Pet&gt; 传递给PagedListAdapter,不如将​​Pet 转换为TransformedPet,以便他可以通过PagedList&lt;TransformedPet&gt;PagedList&lt;TransformedPet&gt; 通过@987654349 传递给PagedListAdapter @。现在,百万美元的问题是,你如何获得PagedList&lt;TransformedPet&gt;,因为你的道正在返回DataSource.Factory&lt;Integer, Pet&gt;
  • 有谁知道将 PagedList 转换为 PagedList
猜你喜欢
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
相关资源
最近更新 更多