2017-12-07 8 views
0

を追加しました。FireBase onChildは、私は、ボタンのクリックオン「.push()」メソッドのキーを追加してい

私は親ノードに「子」を追加するたびに、それは常にその特定のノードにすべての子を取得します。 ここにデータベース構造があります。 enter image description here

"plans"親ノードの下に5つの子ノードがすでにあるとします。 は、私は1つの以上のノードを追加すると、すべての5も同様に表示され、その後、第六1があまりにも表示されます。合計11個のノードが表示されます。

私が研究し、「Onchildadded」メソッドは、このためだけ罰金が、そのがaddValueEventListenerと同じことをやっていきます見ました。ここで

は上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と一緒に表示される。ノードが追加されました。

ヘルプ!あなたのコードから

答えて

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

refreshItems()メソッドは「スワイプリフレッシュレイアウト」のメソッドで、スワイプがあるとリフレッシュされることを示します。私がrefreshItemsメソッドを削除した場合、スワイプ・リフレッシュ・ポイントが表示されません。 –

+0

アダプタのデータを最新のものに更新するためにスワイプしておいたと思いますが、今は必要ありません。スワイプをリフレッシュし続けたい場合は、アダプタデータをクリアする必要があります。 –

+0

まだすべてのデータを2回読み込みます。 –

関連する問題