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.