Android Paging 3:LoadType.APPEND 返回空远程键

Posted

技术标签:

【中文标题】Android Paging 3:LoadType.APPEND 返回空远程键【英文标题】:Android Paging 3: LoadType.APPEND returns null remote keys 【发布时间】:2021-06-23 02:04:40 【问题描述】:

我一直在尝试解决我与RemoteMediatorAPPEND LoadType 的问题。

在空的 Room DB 上,LoadType 的流动方式如下: REFRESH -> PREPEND -> APPEND (remoteKeys = null, endOfPaginationReached = true)

实体和远程键表至少有 10 行,LoadType 的流动方式如下: REFRESH -> PREPEND -> APPEND (remoteKeys = prev=null, next=2, endOfPaginationReached = false)

显然,我的问题是在新安装的设备上(房间数据库为空),用户不会看到超过 10 个项目,因为APPENDstate.lastItemOrNull() 正在返回null

到目前为止,这是我的代码:

private suspend fun getRemoteKeysForLastItem(state: PagingState<Int, MovieCache>): MovieRemoteKeys? 
    return state.lastItemOrNull()?.let  movie ->
        appDatabase.withTransaction 
            appDatabase.remoteKeysDao().remoteKeysByImdbId(movie.imdbId)
        
    

对于我的load() 函数:

val loadKey = when (loadType) 
            LoadType.REFRESH -> 
                val key = getRemoteKeysClosestToCurrentPosition(state)
                Timber.d("REFRESH key: $key, output: $key?.nextKey?.minus(1)")
                key?.nextKey?.minus(1) ?: 1
            
            LoadType.PREPEND -> 
                Timber.d("PREPEND key requested")
                return MediatorResult.Success(true)
            
            LoadType.APPEND -> 
                val key = getRemoteKeysForLastItem(state)
                Timber.d("APPEND key: $key")
                appDatabase.withTransaction 
                    val size = movieDao.movies().size
                    val remoteSize = remoteKeysDao.allKeys().size
                    Timber.d("APPEND DB size: $size, remote: $remoteSize")
                
                key?.nextKey ?: return MediatorResult.Success(true)
            
        

这是一个示例 logcat,显示 APPENDnull

让我的应用至少无法向下滚动一次!

编辑:这是我保存远程密钥的方法:

【问题讨论】:

【参考方案1】:

最后,通过依赖数据库上的 remoteKeys 而不是PagingState,这就是我设法解决此问题的方法:

LoadType.APPEND -> 
//  val key = getRemoteKeysForLastItem(state) // Doesn't work. state returns NULL even Room has data for both remote keys and entity.
    val key = appDatabase.withTransaction 
        remoteKeysDao.allKeys().lastOrNull() // Workaround
    
    key?.nextKey ?: return MediatorResult.Success(true)


【讨论】:

你能看看这个查询吗? ***.com/questions/67951960/…

以上是关于Android Paging 3:LoadType.APPEND 返回空远程键的主要内容,如果未能解决你的问题,请参考以下文章

在 Paging 3 库 Android Kotlin 中更新当前页面或更新数据

使用 Paging 3 Android 从房间获取最新数据

Android Paging 3 不显示 Loadstate Adapter

使用 Jetpack Compose 无限加载 Android Paging 3 库而无需滚动

Android Jetpack Paging 3:带 Room 的 PagingSource

Android Paging 3 在 invalidate() 上清除 recyclerview