2016-12-23 83 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