Android:分页与RemoteMediator保持加载加载类型PREPEND直到滚动开始?



我正在尝试使用RemoteMediator实现分页。

现在,远程数据源是一个随机狗图像API,因此端点没有分页,而是在每个请求中返回一个随机狗图像url列表。

RemoteMediator是这样的:

class DogImageRemoteMediator(
private val database: DogImageDatabase
private val networkService: DogImageApiService
) : RemoteMediator<Int, DogImageEntity>() {

val dogImageDao = database.dogImageDao()
override suspend fun load(
loadType: LoadType,
state: PagingState<Int, DogImageEntity>
): MediatorResult {
return try {
val response = networkService.getDogImages(DogImageApiService.BATCH_SIZE)
database.withTransaction {
if (loadType == LoadType.REFRESH) {
dogImageDao.clearAll()
}
dogImageDao.insertAll(response.imageUrls.map { url -> DogImageEntity(url = url) }
MediatorResult.Success(endOfPaginationReached = false)
} catch (e: IOException) {
MediatorResult.Error(e)
} catch (e: HttpException) {
MediatorResult.Error(e)
}
}
}
override suspend fun initialize(): InitializeAction {
return InitializeAction.LAUNCH_INITIAL_REFRESH
}
}

现在,应用程序开始初始刷新。

然后,如果您不滚动,RemoteMediator将继续加载加载类型为PREPEND

滚动时,RemoteMediator将停止加载,加载类型为PREPEND

日志看起来像这样:

// ...
PREPEND    // this keeps repeating until scroll
Anchor position: null
Clipped refresh key: null
PREPEND    // scrolled here!
Anchor position: 31
Clipped refresh key: 26

之后,当你向下滚动时,RemoteMediator将加载加载类型为APPEND的额外数据,并且应用程序似乎按预期工作。

因此,似乎这种连续加载加载类型PREPEND与应用程序初始加载时不滚动有关,或者如果锚点位置和剪切刷新键是null

我不知道为什么。我已经试验了PagingConfig值,但不能注意到任何差异。

PagingConfig看起来像这样:

PagingConfig(pageSize = 30, initialSize = 10, prefetchDistance = 10)

提前感谢。

我仍然不确定为什么会发生这种情况,但我可以通过将下面的代码添加到RemoteMediator中的load函数来修复它。

if (loadType == LoadType.PREPEND) {
return MediatorResult.Success(endOfPaginationReached = true)
}

相关内容

  • 没有找到相关文章

最新更新