Android Paging3可改变页面大小

Android Paging3可改变页面大小,android,android-jetpack,android-paging-3,Android,Android Jetpack,Android Paging 3,如何使用分页3库,因为每个页面的大小可能不同 我正在尝试显示一个日历,其中每个页面将由一周表示,并且每周可以有0到n个会议 我想我可以在数据源中使用今天作为初始加载的分页键,在上一页/下一页中使用±7天,例如: class CalendarPagingSource @Inject constructor( private val calendarApi: CalendarApi, ) : RxPagingSource<ZonedDateTime, Meeting>() {

如何使用分页3库,因为每个页面的大小可能不同

我正在尝试显示一个日历,其中每个页面将由一周表示,并且每周可以有0到n个会议

我想我可以在数据源中使用今天作为初始加载的分页键,在上一页/下一页中使用±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 CalendarPagingSource@Inject构造函数(
私有val calendarApi:calendarApi,
):RxPagingSource(){
重写fun loadSingle(参数:LoadParams):Single{
val page=params.key?:ZonedDateTime.now()
val startDate=page.format(模式(“yyyy-MM-dd”))
返回日历API
.myMeetings(开始日期)
.map{toLoadResult(第页,it)}
.onErrorReturn{LoadResult.Error(it)}
}
LoadResult的私人乐趣(键:ZonedDateTime,条目:List):LoadResult{
val now=ZoneDateTime.now()
//今天之前和之后的装载时间不得超过90天
返回LoadResult.Page(
数据=条目,
prevKey=if(now.minusDays(90L).isBefore(key))key.minusDays(DATE_RANGE)else null,
nextKey=if(now.plusDays(90L).isAfter(key))key.plusDays(DATE\u 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
    }
}

类CalendarRepository@Inject构造函数(
private val pagingSource:CalendarPagingSource
) {
有趣的myMeetings():可见{
传呼机(
config=PagingConfig(
页面大小=???,
enablePlaceholders=false
),
pagingSourceFactory={pagingSource}
).可见
}
}

有没有办法不必指定页面大小,只需使用分页键(在本例中为ZonedDateTime)进行分页?

pageSize
只是发送到
LoadParams
的提示,分页3可以很好地处理可变页面大小,您的
PagingSource
dorsn不需要考虑请求的
loadSize

只需在
LoadParams.loadSize
中输入您想要显示的任何数字即可。通常情况下,它可能是基于视口大小的,因此您可以估计要加载多少天的事件