2016-12-23 45 views
0

我正在编写一个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之后的项目,并将收到的消息限制在某个数量。

回答

2

我很确定我不到一天前回答,所以我建议扫描我的答案。但我会重复一遍。

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

+0

我认为这对我来说很合适,我有另外一个查询获得前10个项目并添加了onItemRangeInserted,当用户浏览旧消息和新消息时(在recyclerView的位置0添加)他将听众指出。 – MeLine