如何根据Firebase数据库中的项目数量筛选数据
我正在编写一个android聊天应用程序,我试图在使用自定义FirebaceRecyclerAdapter的RecyrclerView中使用Firebase数据库实现无限滚动。对于第一次消息加载,我使用通过.orderByChild()排序数据的查询从Firebase数据库获取数据,然后使用.limitToFirst(specificCount)排序。但是当用户滚动到最后一个可见的项目时,我必须得到下一部分消息,并且问题出现后,我没有直接从specificbase中获取Firebase数据库中的消息。我试着用代码:如何根据Firebase数据库中的项目数量筛选数据
int startCount = mLayoutManager.getItemCount();
FirebaseDatabase
.getInstance()
.getReference()
.child(RequestParameters.FB_CHILD_MESSAGES)
.orderByChild(RequestParameters.FB_CHILD_MESSAGES_ORDERING_TIME)
.startAt(startCount)
.endAt(startCount + CustomFirebaceRecyclerAdapter.NEXT_MESSAGE_PORTION_COUNT)
.addListenerForSingleValueEvent(...)
但是在我读.startAt的文档()我知道有多么愚蠢是这样的。任何人都可以帮助进行查询,获取specificCount
之后的项目,并将收到的消息限制在某个数量。
我很确定我不到一天前回答,所以我建议扫描我的答案。但我会重复一遍。
Firebase数据库API本质上不太适合分页。想想当用户在第1页时插入物品时会发生什么(前10个物品)。他们最终在第2页的开头看到前一个项目10,但是永远不会看到新插入的项目。
这就是说,如果你想做分页,这在技术上是可行的。但不是想要跳过 10个项目,您将不得不通知Firebase在上一页的最后一项开始查询。这就是所谓的锚项目,并在代码中,它看起来是这样的:
FirebaseDatabase
.getInstance()
.getReference()
.child(RequestParameters.FB_CHILD_MESSAGES)
.orderByChild(RequestParameters.FB_CHILD_MESSAGES_ORDERING_TIME)
.startAt(timeOfLastItemOnPreviousPage, keyOfLastItemOnPreviousPage)
.addListenerForSingleValueEvent(...)
这里的关键属性是:
timeOfLastItemOnPreviousPage
:最后一个项目的FB_CHILD_MESSAGES_ORDERING_TIME
属性的值前一页keyOfLastItemOnPreviousPage
,上一页上的最后一项的关键字(在需要多个项目的情况下需要相同的值FB_CHILD_MESSAGES_ORDERING_TIME
我认为这对我来说很合适,我有另外一个查询获得前10个项目并添加了onItemRangeInserted,当用户浏览旧消息和新消息时(在recyclerView的位置0添加)他将听众指出。 – MeLine