27

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

通常我有3个模块:

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

为了引入分页,我不得不将PagedList<T>类视为领域类。(IMO 并不是一个糟糕的主意,因为最后是一个列表并且数据源是抽象的)

所以在域层我可以有一个像这样的存储库:

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 使用来自模型层的数据,在这种情况下是 a PagedList,据我所知,分页列表不支持映射。

那么在这种情况下应该做些什么呢?

4

1 回答 1

4

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

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

其次,它必须DataSource在需要更多页面时发出警报。PagedListAdapter接收 a PagedList,并且在绑定项目时,它依赖于检测何时需要新页面的方法loadAround()PagedList

免责声明:这只是我的意见,可以讨论 ,但PagingLibrary默认情况下不是一个干净的解决方案,最简单的方法是在获取它们(网络或数据库)时将模型映射到内部,并将表示模型传递给表示层。映射 PagedList 本身是不合逻辑的(尽管可能),因为它与in紧密耦合。DataStorePagedListPagedListAdapterView

于 2018-06-30T08:56:15.793 回答