我正在尝试Android Architecture Component的分页库,但我怀疑将它集成到基于干净架构的项目中。
一般来说,我有3个模块:
为了引入分页,我不得不将PagedList<T>
类视为域类。 (IMO不是一个可怕的想法,因为最终是一个列表,数据源是抽象的)
所以在域层我可以有一个像:
这样的repostioryinterface 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
有map
和mapByPage
方法,但工厂位于数据层。我的Viewmodel使用模型层中的数据,在这种情况下是PagedList
,据我所知,分页列表不支持映射。
那么在这种情况下适当的做法是什么?
答案 0 :(得分:3)
您无法将PagedList
映射到演示模型中,因为PagedListAdapter
需要PagedList
才能加载下一页/上一页。
PagedList具有两个主要功能,首先是一个数据结构,它使用List
来保存snapshot()
个分页的项目(部分存在和不存在)可以轻松获取当前项目,将域模型映射到演示文稿中,然后将其传递到ListAdapter以显示项目列表。
其次,当需要更多页面时,它必须警告DataSource
。 PagedListAdapter
收到PagedList
,并且在绑定项目时,它依赖于loadAround()
的{{1}}方法来检测何时需要新页面。
免责声明:这只是我的观点,尚待讨论
但默认情况下PagedList
并不是一个干净的解决方案,最简单的方法是在获取PagingLibrary
(网络或数据库)并传递{{1 }}和表示模型添加到表示层。映射PagedList本身不合逻辑(尽管可能),因为它与DataStore
中的PagedList
紧密耦合。