Android Paging3 Изменение размера страницы

Как я могу использовать библиотеку paging3, где каждая страница может различаться по размеру?

Я пытаюсь показать календарь, в котором каждая страница будет представлена ​​неделей, и в каждой неделе может быть от 0 до n встреч.

Я решил, что могу использовать сегодняшний день в качестве ключа подкачки в моем DataSource для начальной загрузки и ±7 дней для предыдущих / следующих страниц, например:

class CalendarPagingSource @Inject constructor(
    private val calendarApi: CalendarApi,
) : RxPagingSource<ZonedDateTime, Meeting>() {

    override fun loadSingle(params: LoadParams<ZonedDateTime>): Single<LoadResult<ZonedDateTime, Meeting>> { 
        val page = params.key ?: ZonedDateTime.now()
        val startDate = page.format(ofPattern("yyyy-MM-dd"))

        return calendarApi
            .myMeetings(startDate)
            .map { toLoadResult(page, it) }
            .onErrorReturn { LoadResult.Error(it) }
    }

    private fun toLoadResult(key: ZonedDateTime, entries: List<Meeting>): LoadResult<ZonedDateTime, Meeting> {
        val now = ZonedDateTime.now()

        // Do not load more than 90 days before and after today
        return LoadResult.Page(
            data = entries,
            prevKey = if (now.minusDays(90L).isBefore(key)) key.minusDays(DATE_RANGE) else null,
            nextKey = if (now.plusDays(90L).isAfter(key)) key.plusDays(DATE_RANGE) else null 
        )
    }
}


Но я столкнулся с проблемой, из-за которой я не могу заранее знать, сколько встреч будет на конкретной неделе.


class CalendarRepository @Inject constructor(
    private val pagingSource: CalendarPagingSource
) {

    fun myMeetings(): Observable<PagingData<Meeting>> {
        return Pager(
            config = PagingConfig(
                pageSize = ???, 
                enablePlaceholders = false
            ),
            pagingSourceFactory = { pagingSource }
        ).observable
    }
}

Есть ли способ, при котором мне не нужно указывать pageSize и просто выполнять разбиение по страницам, просто используя ключ подкачки (в данном случае ZonedDateTime)?

1 ответ

Решение

pageSize это просто подсказка, которая отправляется LoadParams, paging3 прекрасно справляется с переменными размерами страниц, а ваш PagingSource Дорсне нужно уважать то, что loadSize запрашивается.

Просто введите любой номер, в котором хотите появиться LoadParams.loadSize. Как правило, это может быть что-то, основанное на размере вашего окна просмотра, чтобы вы могли оценить, сколько дней загружать события.

Другие вопросы по тегам