我正在添加" .push()"单击按钮上的方法键。
每次我添加一个" Child"到父节点,它总是将所有子节点提取到该特定节点。 这是数据库结构。
假设"计划"下有5个子节点。父节点。 我将添加一个节点,所有5个节点也将显示,然后第6个节点也将显示。因此将显示总共11个节点。
我研究并看到了" Onchildadded"方法可以正常工作,但它与addValueEventListener做同样的事情。
这是关于on addValueEventListener的代码(我已经附加到活动的onStart的初始方法,因此,只要用户打开应用程序,它就会在recyclerview和cardview中显示当时的所有节点。
q1.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot dataSnapshot1:dataSnapshot.getChildren())
{
cardViewPlaninfo card = dataSnapshot1.getValue(cardViewPlaninfo.class);
listplans .add(card);
String TAG = "cardTAG";
cardViewPlaninfo cvpi = new cardViewPlaninfo(card.getUserKEY(),card.getPlanpostedbyname().toString(),card.getCategory().toString(),card.getLocation().toString(),card.getDateandtime().toString(),card.getContribute().toString(),card.getExtranotes().toString());
cardViewPlaninfolistobj.add(cvpi);
adapter.notifyDataSetChanged();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
super.onStart();
}
这就是我正在写的代码"刷卡刷新视图"。
void refreshItems()
{
Query q1 = databaseUsers.child("plans");
q1.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Log.i("OnChildAdded",dataSnapshot.getKey().toString());
cardViewPlaninfo card = dataSnapshot.getValue(cardViewPlaninfo.class);
listplans .add(card);
String TAG = "cardTAG";
cardViewPlaninfolistobj.add(card);
adapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
onItemsLoadComplete();
}
void onItemsLoadComplete()
{
srl.setRefreshing(false);
adapter.notifyDataSetChanged();
}
所以最后一个想法是,当用户打开活动" AfterLogin" onStart()方法运行,它显示父节点"计划"下的所有子节点。并且当另一个用户在父节点"计划"下添加一个子节点的节点时,其他用户应该能够滑动并且添加的唯一子节点与另一个用户节点一起显示。所以5个节点已添加+ 1已添加的新节点。
帮助!
答案 0 :(得分:0)
你需要从你的代码中删除不需要的refreshItems()方法我试过这段代码希望这对你有用。
Query query = null;
query = FirebaseDatabase.getInstance().getReference().child("Parent Node");
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
query.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
cardViewPlaninfo card = dataSnapshot.getValue(cardViewPlaninfo.class);
mCardViewPlaninfoRecyclerAdapter.add(card);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
Log.d("Unable to get message: " + "child changed");
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
Log.d("Unable to get message: " + "child removed");
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d("Unable to get message: " + databaseError.getMessage());
}
});
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d("Unable to get message:", "Unable to get message: ");
}
});
//add this method to your adapter
public void add(cardViewPlaninfo card) {
mCardViewPlaninfoList.add(card);
notifyItemInserted(mCardViewPlaninfoList.size() - 1);
}