如何在Android Room中使用PagedListAdapter获取总查询计数

问题描述 投票:0回答:2

这遵循上一个问题的逻辑,在这里引用相关代码部分:

我实现了以下查询,它可以返回 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 个..

android search android-sqlite android-room android-search
2个回答
0
投票

官方文档再次无法满足另一个基本场景。我发现的唯一解决方案是运行两个相同的查询;一个用于查找结果总数,另一个用于显示要显示的实际项目列表。


0
投票

我有部分答案,也许有人可以弄清楚其余的。

我发现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)
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.