Android Paging3 改变页面大小
Android Paging3 Varying Page Size
如何使用 paging3 库,使每个页面的大小都不同?
我正在尝试显示一个日历,其中每个页面将由一周表示,并且每周可以有 0 到 n 个会议。
我想我可以使用今天作为初始加载数据源中的分页键,并为 previous/next 页面使用 ±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)进行分页?
pageSize
只是发送到 LoadParams
的提示,paging3 可以很好地处理可变页面大小,您的 PagingSource
不需要遵守 loadSize
被要求。
只需输入您想在 LoadParams.loadSize
中出现的任何数字。通常它可能是基于您的视口大小的东西,因此您可以估计要加载多少天的事件。
如何使用 paging3 库,使每个页面的大小都不同?
我正在尝试显示一个日历,其中每个页面将由一周表示,并且每周可以有 0 到 n 个会议。
我想我可以使用今天作为初始加载数据源中的分页键,并为 previous/next 页面使用 ±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)进行分页?
pageSize
只是发送到 LoadParams
的提示,paging3 可以很好地处理可变页面大小,您的 PagingSource
不需要遵守 loadSize
被要求。
只需输入您想在 LoadParams.loadSize
中出现的任何数字。通常它可能是基于您的视口大小的东西,因此您可以估计要加载多少天的事件。