我正在使用Firebase实时数据库制作公共聊天应用,但仍坚持这个问题。与普通的聊天应用程序一样,我只向用户显示少量文本,并且当用户滚动列表时/如果更新并显示更多消息。
我有一个Firebase参考的监听器,它只显示(例如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)
并重新填充列表。 任何帮助,将不胜感激。
答案 0 :(得分:1)
Firebase查询是不可变的。如果您更改传递给limitToLast()
的值,它将成为新查询。
因此,您必须将新侦听器附加到新查询,然后使用该侦听器中的项重新填充列表。
如果您跟踪列表中每个现有项目的密钥(dataSnapshot.getKey()
),则可以通过检查新侦听器中的每个项目是否已存在于列表中来优化列表的更新。 / p>