我正在尝试来自 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
有map
和 mapByPage
方法,但工厂位于数据层。我的 Viewmodel 使用来自模型层的数据,在这种情况下将是 PagedList
,据我所知,分页列表不支持映射。
那么在这种情况下应该怎么做呢?
最佳答案
您不能将 PagedList
映射到表示模型中,因为 PagedListAdapter
需要 PagedList
来加载下一页/上一页。
PagedList 有两个主要功能,首先它是一个数据结构,用于保存分页项目的List
(部分存在和部分不存在),使用 snapshot()
你可以轻松获取当前项目,将域模型映射到演示文稿并将其传递给 ListAdapter显示项目列表。
其次,它必须在需要更多页面时提醒 DataSource
。 PagedListAdapter
接收一个 PagedList
,并且在绑定(bind)项目时它依赖于 PagedList
的 loadAround()
方法来检测何时有新的需要页面。
免责声明:这只是我的意见,欢迎讨论
但是 PagingLibrary
默认情况下不是一个整洁的解决方案,最简单的方法是在获取它们时将 domain 模型映射到 DataStore
中(网络或数据库)并将带有 presentation 模型的 PagedList
传递给表示层。映射 PagedList 本身是不合逻辑的(尽管可能),因为它与 View
中的 PagedListAdapter
紧密耦合。
关于具有整洁架构的 Android 分页库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50548387/