具有干净架构的Android分页库

Mar*_*cci 17 android clean-architecture android-architecture-components android-jetpack android-paging

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

一般来说我有3个模块:

  • 主模块(App)
  • 数据模块(具有网络和数据库依赖关系的Android模块)
  • 域模块(Pure Kotlin模块)

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

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

interface ItemRepository {
    fun getItems():PagedList<Item>
}
Run Code Online (Sandbox Code Playgroud)

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

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()
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.我的疑问是,当我们需要变换域模型为表示层(比方说我的项目需要意识到,如果被检查显示的图标检查),通常我会我的域模型映射到演示文稿一个.

我知道DataSourceFactoryhas mapmapByPage方法,但工厂驻留在数据层.我的Viewmodel使用来自模型层的数据,在这种情况下,这将是一个数据PagedList,据我所知,分页列表不支持映射.

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

Kei*_*ati 6

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

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

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

免责声明:这只是我的观点,可供讨论, 但PagingLibrary默认情况下并不是一个干净的解决方案,最简单的方法是在获取模型DataStore(网络或数据库)时将域模型映射到内部,并将表示PagedList模型与表示模型一起传递到表示层。映射 PagedList 本身并不符合逻辑(尽管可能),因为它与.PagedListAdapterView