使用第3页获取房间可观察列表



我使用Paging 3,本地数据库使用Room,@Query from Room如下:

@Query("SELECT * FROM Channel LIMIT :limit OFFSET :offset")
suspend fun getAllChannels(limit: Int, offset: Int): List<Channel>

然后我像这样在PagingSource中获取我的数据,并返回带有我的数据的LoadResult.Page

channels = channelDao.getAllChannels(
params.loadSize,
position * params.loadSize
)
return LoadResult.Page(
data = channels,
prevKey = if (position == INITIAL_INDEX) null else position - 1,
nextKey = if (mData.isEmpty()) null else position + 1
)

在我的存储库中,我得到这样的通道:

override fun getAllChannels(): Flow<PagingData<Channel>> {
return Pager(
PagingConfig(
pageSize = 20,
enablePlaceholders = false,
initialLoadSize = 20
)
) {
ChannelPagingSource(
channelDao
)
}.flow
}

这种方法的问题是,我的视图无法观察到通道对象上发生的任何修改,因此如果它被更新,就无法得到通知。使用分页可以获得可观察的对象吗?

一种替代方式是放弃寻呼并且仅返回Flow<列表>从Room下载并消费它,但它很重,会使应用程序的速度减慢一点。

  1. 在gradle模块中添加room-paging依赖项。使用该Room可以处理查询中的PagingSource对象
implementation "androidx.room:room-paging:2.5.0"
  1. 创建一个在@Dao interface中返回PagingSource<Int, EntityDb>的方法。Int-页码/偏移量,EntityDb-您的数据库模型,在您的情况下为Channel
@Query("SELECT * FROM Channel")
fun pagingSource(): PagingSource<Int, Channel>
  1. 从存储库中获取PagingData
fun observePagingSource(): Flow<PagingData<Channel>> {
return Pager(
config = PagingConfig(pageSize = 20, initialLoadSize = 20),
pagingSourceFactory = { channelDao.pagingSource() }
).flow
}

一件重要的事情-使用您的刀的单个实例

如果您在一个Dao实例中插入/更新/删除数据,并在另一个实例中观察到它的变化,则不会收到更新。

相关内容

  • 没有找到相关文章

最新更新