2016-10-03 53 views
1

我正在製作一個使用Firebase實時數據庫的公開聊天應用程序,但一直存在這個問題。和普通的聊天應用程序一樣,我只向用戶顯示少量文本,以及何時/如果滾動列表的用戶更新並顯示更多消息。如何更改值並重新觸發Firebase中的eventListener?

我有一個監聽到我的火力地堡的參考,這是唯一顯示(比如10個消息):

int j = 10; 
myRef.child("Chat").limitToLast(j).addChildEventListener(new com.google.firebase.database.ChildEventListener() { 
     @Override 
     public void onChildAdded(com.google.firebase.database.DataSnapshot dataSnapshot, String s) { 
     // Map<String,Object> datemsg = (Map<String,Object>)dataSnapshot.getValue(); 

      Map<String,Object> msg = (Map<String,Object>)dataSnapshot.getValue(); 


         String text = msg.get("Text").toString(); 
         values.add(text); 


     @Override 
     public void onChildChanged(com.google.firebase.database.DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onChildRemoved(com.google.firebase.database.DataSnapshot dataSnapshot) { 

     } 

     @Override 
     public void onChildMoved(com.google.firebase.database.DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

現在我有一個滾動監聽器,對於j的值更改爲j+10但隨後的ChildEvenListener不觸發並且新消息不會添加到列表視圖中。

我也嘗試過使用查詢,但在更新值後又出現同樣的問題,應如何更新適配器?

沒有新的孩子加入,從而childevent監聽不會被觸發,但我想改變的

limitToLast(j) 

大小和重新填充列表。 任何幫助,將不勝感激。

回答

1

Firebase查詢是不可變的。如果您更改了您傳入的值limitToLast(),它將成爲新的查詢。

因此,您必須將新偵聽器附加到新查詢,然後使用該偵聽器中的項目重新填充列表。

如果您跟蹤列表中每個現有項目的密鑰(dataSnapshot.getKey()),則可以通過檢查列表中是否存在來自新偵聽器的每個項目來優化列表的更新。

+0

哦,我明白了。我雖然可能有另一種方法來實現它,而不是再次添加一個監聽器。現在我有了一個方向,我可以前進。謝謝你的時間。 –

+0

我對此感到困惑的另一件事是,如果我們可以將int值作爲參數傳遞給startAt()或endAt()來指出該子節點中的確切節點數量? –

+0

如果您想要開始的項目的*鍵*,您可以將其作爲第二個參數傳遞給'startAt()'。但是這是一個經常被開發人員誤解的參數,所以ymmv。 –