我正在编写一个Android聊天应用程序,我正在尝试使用自定义FirebaceRecyclerAdapter在RecyrclerView中使用Firebase数据库实现无限滚动。对于第一个消息加载,我使用通过.orderByChild()然后.limitToFirst(specificCount)排序数据的查询从Firebase数据库获取数据。但是,当用户滚动到最后一个可见项目时,我必须得到下一部分消息,问题出现后我没有直接从specialCount之后从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
之后的项目,并将收到的邮件限制为某些计数。
答案 0 :(得分:2)
我很确定我不到一天前回答了这个问题,所以我建议扫描我的答案。但我会重复一遍。
Firebase数据库API本质上不太适合分页。想想当用户在第1页(前十个项目)时插入项目时会发生什么。他们最终在第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