我的应用分为两个部分,用户和管理员。管理员可以在firebase db / node中添加/删除新项目,并将其反映到用户应用程序中。请注意,用户应用程序始终处于打开状态,并使用以下代码更新列表。
mFirebaseDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
arrayList.clear();
for (DataSnapshot dataSnapshotChild : dataSnapshot.getChildren()) {
for (DataSnapshot snapshot : dataSnapshotChild.getChildren()) {
Log.v("onDataChange", ":" + snapshot.getValue());
Model model = new Model();
model.setReceivedServiceCategory(dataSnapshotChild.getKey());
model.setKey(snapshot.getKey());
model.setReceivedFrom((String) snapshot.child("xxxxx").getValue());
model.setRaisedAtTimings((String) snapshot.child("xxxxx").getValue());
model.setReceivedStatus((String) snapshot.child("xxxx").getValue());
arrayList.add(model);
}
}
loadDataToRecyclerView();
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.v("DatabaseError", databaseError.getMessage());
}
});
我的问题,我想在firebase db / node中显示弹出的新添加的条目。现在,我可以看到更新的列表,但同时我想突出显示最新添加的条目。另外,我不想比较旧的&最新列表,请提供解决方案,除了比较2个列表,如果firebase提供任何其他合适的方式?
答案 0 :(得分:1)
您可能希望从数据库中获取有关更新数据的更详细信息。在这种情况下,您应该使用ChildEventListener
类。鉴于您的树中有两个单独的分支,您将要为每个品牌使用单独的ChildEventListener
。
这导致两个听众,每个都有onChildAdded
,onChildChanged
等方法。但每种方法都很简单。
第一个片段:
mFirebaseDatabase.getChild("user").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot snapshot, String previousChildKey) {
Log.v("onChildAdded", ":" + snapshot.getKey() + " " + snapshot.getValue());
Model model = new Model();
// TODO: model.setReceivedServiceCategory(dataSnapshotChild.getKey());
model.setKey(snapshot.getKey());
model.setReceivedFrom((String) snapshot.child("xxxxx").getValue());
model.setRaisedAtTimings((String) snapshot.child("xxxxx").getValue());
model.setReceivedStatus((String) snapshot.child("xxxx").getValue());
arrayList.add(model);
}
public void onChildRemoved(DataSnapshot snapshot) {
// TODO: remove the item with snapshot.getKey() from the array list
}
...
});
答案 1 :(得分:0)
复制@Frank van解决方案的一种方法是首先使用你的监听器
mFirebaseDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
arrayList.clear();
for (DataSnapshot dataSnapshotChild : dataSnapshot.getChildren()) {
for (DataSnapshot snapshot : dataSnapshotChild.getChildren()) {
Log.v("onDataChange", ":" + snapshot.getValue());
Model model = new Model();
model.setReceivedServiceCategory(dataSnapshotChild.getKey());
model.setKey(snapshot.getKey());
model.setReceivedFrom((String) snapshot.child("xxxxx").getValue());
model.setRaisedAtTimings((String) snapshot.child("xxxxx").getValue());
model.setReceivedStatus((String) snapshot.child("xxxx").getValue());
arrayList.add(model);
}
}
loadDataToRecyclerView();
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.v("DatabaseError", databaseError.getMessage());
}
});
一次检索所有数据并在回收视图中显示它们,然后取消注册您的监听器并添加一个新的ChildEventListener,Firebase将发送它的下一个节点将是最后一个条目。
通过这种解决方案,逻辑变得有点混乱。另一种解决方案是在firebase模型中添加日期字段,从firebase检索所有数据并将它们存储在TreeMap结构中,您可以使用Comparator根据日期对数据进行排序。然后,您将从最后一个条目到第一个条目排序所有数据。从那里,您可以将代码写入您的Recycler View适配器,以便以不同于其他行的方式处理第一行(例如,突出显示第一行)。