2

私のアプリは、ユーザーと管理の2つのセクションに分かれています。管理者はfirebase db/nodeに新しい項目を追加/削除することができ、ユーザアプリケーションに反映されます。ユーザーのアプリケーションが常に開いていて、下のコードでリストを更新しているとします。ファイアベースDBにどのエントリが追加されたかを知るには?

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に新しく追加されたエントリに対してポップアップを表示することです。今は、最新のリストを見ることができますが、同時に追加された最新のエントリを強調したいと思います。また、古い&の最新のリストを比較したくない場合は、firebaseが提供する他の適切な方法があれば、2つのリストを比較する以外に解決策を教えてください。

答えて

1

データベースから更新されたデータに関するより詳細な情報を得ようとしているようです。その場合は、ChildEventListenerクラスを使用する必要があります。あなたのツリーに2つの別々のブランチがあることを考えると、各ブランドに別々のChildEventListenerを使用することになります。

これは、それぞれがonChildAddedonChildChangedなどのメソッドを持つ2つのリスナーにつながりますが、各メソッドは非常に簡単です。

最初のスニペット:

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 
    } 
    ... 

}); 
+0

ありがとうございます。 – VVB

+0

初めての呼び出しのようです – VVB

+0

'ChildEventListener'には、子ノードのライフサイクルで発生する様々な瞬間に呼び出される4つのメソッドがあります:それは追加、変更、削除、またはコレクション/クエリの別の位置に移動します。 –

0

@Frankバン・ソリューションをcompines一つの方法は、最初に一度にすべてのデータを取得し、あなたのリサイクルビュー上に表示する

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 Adapterにコードを書き込んで、他の行とは異なる方法で最初の行を処理することができます(たとえば、最初の行を強調表示)。

関連する問題