我正在尝试从Android Architecture Component使用分页库,但是我怀疑是否将其集成到基于干净架构的项目中。
通常我有3个模块:
为了引入分页,我不得不考虑将
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
具有map
和mapByPage
方法,但是工厂位于数据层。我的Viewmodel使用来自模型层的数据,在这种情况下,该数据将是PagedList
,据我所知,分页列表不支持映射。那么在这种情况下应该做些什么呢?
最佳答案
您无法将PagedList
映射到演示模型中,因为PagedListAdapter
需要PagedList
才能加载下一页/上一页。
PagedList有两个主要功能,首先是数据结构,用于保存要分页的项目的List
(部分存在和部分缺失),使用snapshot()
可以轻松获取当前项目,将域模型映射为一个呈现项目并传递将其显示在ListAdapter上以显示项目列表。
其次,当需要更多页面时,它必须警告DataSource
。 PagedListAdapter
接收一个PagedList
,并且在绑定(bind)项目时,它取决于loadAround()
的PagedList
方法来检测何时需要新页面。
免责声明:这只是我的意见,可以讨论
但默认情况下PagingLibrary
并不是一个干净的解决方案,最简单的方法是在获取DataStore
(网络或数据库)后将域模型映射到PagedList
中,并将带有表示形式模型的PagedListAdapter
传递到表示层。映射PagedList本身不合逻辑(尽管可能),因为它与View
中的ojit_code紧密耦合。