这遵循上一个问题的逻辑,在这里引用相关代码部分:
我实现了以下查询,它可以返回 0 到数据库中条目数之间的任意数量的结果,具体取决于查询输入文本:
@Query("SELECT * FROM Conversation JOIN ConversationFts ON Conversation.id == ConversationFts.id WHERE ConversationFts.title LIKE :text GROUP BY Conversation.id")
public abstract DataSource.Factory<Integer, Conversation> search(String text);
除了结果总数之外,一切都运行良好。
由于我每次在返回的观察者中收到结果列表时都将
LivePagedListBuilder
配置为 setInitialLoadSizeHint(15)
,因此列表的大小始终为 15(如果查询返回的结果较少,则更小),这是观察者第一次被触发对于每个唯一列表(这意味着每当唯一查询输入返回结果列表时)。一旦列表向下滚动超过 15 个结果,它就会根据 PageListAdapter
实现更自动地加载,但除了 15 之外,我从未得到任何其他计数。
searchRepository(myQuery).observe(this, resultList -> {
Log.i("RESULT", resultList.size()); // size is always 15 or less
});
那么我怎样才能从一开始就获得结果总数呢?我的目标是向用户显示搜索在搜索摘要中返回了多少结果,但由于当前的实现永远不会说如果结果超过 15 个,则结果不会超过 15 个..
官方文档再次无法满足另一个基本场景。我发现的唯一解决方案是运行两个相同的查询;一个用于查找结果总数,另一个用于显示要显示的实际项目列表。
我有部分答案,也许有人可以弄清楚其余的。
我发现room返回的PagingSource(实际上是LimitOffsetPagingSource)执行了计数查询并将结果存储在
internal val itemCount
中。你可以这样访问它
@Suppress("INVISIBLE_MEMBER")
pagingSource.itemCount.get()
对我来说不幸的是,它只是在我尝试访问它后才立即初始化。我一直不知道如何在正确的时间访问它。
我的完整(不正确)代码如下所示:
fun getPagedList(): LiveData<PagingData<Link>> {
return liveSearchSettings.distinctUntilChanged().switchMap { settings ->
return@switchMap Pager(PagingConfig(
initialLoadSize = 24,
pageSize = 12
)) {
val pagingSource = searchWithSettings(settings) as LimitOffsetPagingSource
@Suppress("INVISIBLE_MEMBER")
queueSize.value = pagingSource.itemCount.get()
return@Pager pagingSource
}
.liveData
.cachedIn(viewModelScope)
}
}