2016-10-03 82 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。 –