FireBase onChild已添加

时间:2017-12-07 04:47:32

标签: android firebase firebase-realtime-database

我正在添加" .push()"单击按钮上的方法键。

每次我添加一个" Child"到父节点,它总是将所有子节点提取到该特定节点。 这是数据库结构。 enter image description here

假设"计划"下有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已添加的新节点。

帮助!

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);
                        }