在使用 Android Paging 3 进行远程数据加载的时候,可能会遇到一个问题,就是 remoteMediator 在 APPEND 模式下会不断地加载相同的数据,导致数据重复。这个问题可以通过以下步骤进行解决:
class MyRemoteMediator(private val api: Api) : RemoteMediator() {
private var lastLoadedPage: Int? = null
override suspend fun load(loadType: LoadType, state: PagingState): MediatorResult {
val page = when (loadType) {
LoadType.REFRESH -> {
// 当前为下拉刷新模式,将页码重置为1
lastLoadedPage = 1
lastLoadedPage
}
LoadType.PREPEND -> {
// 当前为上拉加载更多(PREPEND)模式,直接返回空数据
return MediatorResult.Success(endOfPaginationReached = true)
}
LoadType.APPEND -> {
// 当前为下拉加载更多(APPEND)模式,将页码加1
lastLoadedPage?.plus(1) ?: 1
}
}
// 判断当前页是否已经加载过
if (lastLoadedPage == page) {
// 如果已经加载过,直接返回 endOfPaginationReached = true,表示已经到达数据末尾
return MediatorResult.Success(endOfPaginationReached = true)
}
// 如果当前页还没有加载过,从远程服务器上获取数据
val result = api.loadMyEntities(page)
// 将当前页记录下来,以便下次判断是否需要加载
lastLoadedPage = page
// 将获取到的数据写入本地数据库
// ...
return MediatorResult.Success(endOfPaginationReached = result