具有干净架构的Android分页库

时间:2018-05-27 01:45:20

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

我正在尝试Android Architecture Component的分页库,但我怀疑将它集成到基于干净架构的项目中。

一般来说,我有3个模块:

  • 主要模块(应用程序)
  • 数据模块(具有网络和数据库依赖关系的Android模块)
  • 域模块(Pure Kotlin模块)

为了引入分页,我不得不将PagedList<T>类视为域类。 (IMO不是一个可怕的想法,因为最终是一个列表,数据源是抽象的)

所以在域层我可以有一个像:

这样的repostiory
interface ItemRepository {
    fun getItems():PagedList<Item>
}

然后在数据模块中创建如下的实现:

class ItemRepositoryImpl: ItemRepositoy(private val factory:ItemDataSourceFavtory) {
    fun getItems():PagedList<Item> {

  val pageConfigurations = PagedList.Config.Builder()
            .setPageSize(10)
            .setInitialLoadSizeHint(15)
            .setPrefetchDistance(5)
            .setEnablePlaceholders(false)
            .build()

    return RxPagedListBuilder(locationDataSourceFactory, pageConfigurations)
            .setInitialLoadKey(1)
            .buildObservable()
}

到目前为止一切顺利。我怀疑的是,当我们需要转换表示层的域模型时(假设我的项目需要知道是否被检查以显示已检查的图标)通常我会将我的域模型映射到表示层。

我知道DataSourceFactorymapmapByPage方法,但工厂位于数据层。我的Viewmodel使用模型层中的数据,在这种情况下是PagedList,据我所知,分页列表不支持映射。

那么在这种情况下适当的做法是什么?

1 个答案:

答案 0 :(得分:3)

您无法将PagedList映射到演示模型中,因为PagedListAdapter需要PagedList才能加载下一页/上一页。

PagedList具有两个主要功能,首先是一个数据结构,它使用List来保存snapshot()个分页的项目(部分存在和不存在)可以轻松获取当前项目,将域模型映射到演示文稿中,然后将其传递到ListAdapter以显示项目列表。

其次,当需要更多页面时,它必须警告DataSourcePagedListAdapter收到PagedList,并且在绑定项目时,它依赖于loadAround()的{​​{1}}方法来检测何时需要新页面。

免责声明:这只是我的观点,尚待讨论 但默认情况下PagedList并不是一个干净的解决方案,最简单的方法是在获取PagingLibrary(网络或数据库)并传递{{1 }}和表示模型添加到表示层。映射PagedList本身不合逻辑(尽管可能),因为它与DataStore中的PagedList紧密耦合。