Android пейджинговая библиотека с чистой архитектурой
Я пробовал библиотеку подкачки из Android Architecture Component, но у меня есть сомнения в ее интеграции в проект, основанный на чистой архитектуре.
Обычно у меня есть 3 модуля:
- Основной модуль (приложение)
- Модуль данных (модуль Android с сетевыми и db-зависимостями)
- Модуль домена (модуль Pot 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()
}
Все идет нормально. Я сомневаюсь, когда нам нужно преобразовать модель доменов для уровня представления (скажем, мой элемент должен быть осведомлен, если был отмечен, чтобы показать отмеченную иконку), как правило, я бы привязал свою модель домена к презентации.
Im aware DataSourceFactory
имеет методы map
и mapByPage
, но фабрика находится в слое данных. Моя модель Viewmodel потребляет данные с уровня модели, что в этом случае будет PagedList
, и, насколько мне известно, выгруженный список не поддерживает отображение.
Итак, что было бы подходящей задачей в этой ситуации?
Ответы
Ответ 1
Вы не можете отобразить PagedList
в модель презентации, так как PagedListAdapter
нужен PagedList
для загрузки следующих/предыдущих страниц.
PagedList имеет две основные функции, во-первых, это структура данных для хранения List
элементов, которые разбиваются на страницы (часть присутствует и часть отсутствует), используя snapshot()
вы можете легко получить существующие элементы, отобразить модель домена в презентацию и передать это в ListAdapter, чтобы показать список элементов.
Во- вторых, должен предупредить DataSource
, когда требуется больше страниц. PagedListAdapter
получает PagedList
, и при связывании элементов он зависит от loadAround()
PagedList
для определения необходимости новых страниц.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это только мое мнение и открыто для обсуждения, но PagingLibrary
не является чистым решением по умолчанию, самый простой способ - отобразить модель домена внутри DataStore
при их извлечении (либо в сети, либо в PagedList
) и передать PagedList
с моделями представления в слой представления. Отображение самого PagedList нелогично (хотя и возможно), так как оно тесно связано с PagedListAdapter
в View
.