我正在尝试从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()
    }
    

    到目前为止,一切都很好。我的疑问是,当我们需要转换表示层的域模型时(假设我的项目需要知道是否已选中以显示选中的图标),通常我会将我的域模型映射到一个表示层中。

    我知道DataSourceFactory具有mapmapByPage方法,但是工厂位于数据层。我的Viewmodel使用来自模型层的数据,在这种情况下,该数据将是PagedList,据我所知,分页列表不支持映射。

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

    最佳答案

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

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

    其次,当需要更多页面时,它必须警告DataSourcePagedListAdapter接收一个PagedList,并且在绑定(bind)项目时,它取决于loadAround()PagedList方法来检测何时需要新页面。

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

    10-08 17:16