2016-07-01 4 views
1

Ich implementiere Firebase Recyclerview UI in meiner Anwendung. Ich habe einen Recyclerview-Adapter implementiert und er zeigt mir folgende Ausnahme. Im Anschluss ist mein Adapter Code: enter image description hereDataSnapshot fehlt ein Konstruktor ohne Argumente

Wie kann ich einen Schnappschuss Wert erhalten mit FirebaseRecyclerAdapter:

FirebaseRecyclerAdapter<DataSnapshot, MyHolder> recyclerAdapter = new FirebaseRecyclerAdapter<DataSnapshot, MyHolder>(
       DataSnapshot.class, 
       R.layout.row_slots, 
       MyHolder.class, 
       databaseReference.child("slots").child(uid).child(dayOfWeek).child("time") 
     ) { 
      @Override 
      protected void populateViewHolder(MyHolder viewHolder, DataSnapshot model, int position) { 

       System.out.println("Key : "+model.getKey()); 

      } 

     }; 

Es folgende Ausnahme angezeigt wird?

+0

Sie müssen Ihre eigene Modellklasse definieren. – Piyush

+0

Ja, ich habe das gemacht. Aber mit meiner eigenen Modellklasse kann ich keinen Schlüssel für jeden Knoten bekommen, wie wir es von einem Snapshot erhalten. Deshalb versuche ich mit Snapshot. Gibt es eine Möglichkeit, wie wir den Schlüssel des Knotens mit unserer eigenen Klasse bekommen können (ohne Schlüssel als Kind für diesen Knoten zu speichern) – Dhaval

+0

Ich denke, es gibt ein Missverständnis. Nehmen wir an, es gibt einen Knoten Benutzer. Jedes Mal, wenn ich einen neuen Benutzer hinzufüge, benutze ich die Methode push().Jetzt hat der Benutzer zwei Kindernamen und eine E-Mail-Adresse. Zum Abrufen habe ich also eine User.class mit zwei Feldern name und email erstellt. Alles funktioniert gut. Was aber, wenn ich die Push-ID dieses Benutzers abrufen möchte. Mit Snapshot können wir das bekommen, aber mit User.class können wir das nicht bekommen, weil kein Kind im Benutzerknoten push id enthält. – Dhaval

Antwort

3

firebaser (und Autor der FirebaseUI Adapter) hier

Viele gute Antworten bereits. Ich würde normalerweise empfehlen, eine Java-Klasse zu erstellen, die Ihre Datenobjekte darstellt.

Aber wenn Sie eine DataSnapshot zur Verwendung von Vorsatz sind, können Sie FirebaseRecyclerAdapter.parseSnapshot überschreiben die „Umwandlung“ zu behandeln:

@Override 
protected ChatMessage parseSnapshot(DataSnapshot snapshot) { 
    return snapshot; 
} 
+1

@Dhaval Wenn es Puf ist und es um Firebase geht, solltest du es definitiv untersuchen. –

+1

@Frank Danke. Das ist, was ich gesucht habe. :) – Dhaval

3

Wenn Ihr recyclerAdapter Initialisierung Ihre Übergabe eines DataSnapshot.class als modelClass, wobei ein DataSnapshot nicht wirklich einen Konstruktor ohne Parameter, die ich denke, den Fehler verursacht, auch glaube ich, dass ein DataSnapshot ein ungültiger modelClass macht.

Was die modelClass im FirebaseRecyclerViewAdapter erklärte:

modelClass - Firebase wird marshall die Daten an einer Stelle in eine Instanz einer Klasse, die Sie

Sie bieten sollten Ihre eigenen modelClass definieren indem Sie ein Objekt erstellen, das Ihren Anforderungen entspricht. Es gibt ein einfaches Beispiel für den Link FirebaseRecyclerViewAdapter, den Sie auschecken können. Prost!


EDIT:

sich nach den Kommentaren, schlug ich Ihr eigenes modelClass Objekt haben, haben einen DataSnapshot als Parameter. Für ein einfaches Beispiel dessen, was ich sage, siehe unten.

public class ModelClass { 

     String sampleString; 

     ModelClass() { 
     } 

     ModelClass(DataSnapshot dataSnapshot) { 
      // Do what you need from the dataSnapshot here 
      sampleString = dataSnapshot.child("").toString(); 
     } 

    } 

Ich denke aus dem obigen Beispiel, Sie würden bekommen, was ich meine. ABER, ich bin mir nicht sicher, ob dies empfohlen wird, oder ob es sogar akzeptabel ist. Ich habe das vorher noch nicht ausprobiert, daher bin ich mir auch nicht sicher, ob es funktionieren wird.

Da ist diese Sorge tatsächlich anders als die geschriebene. Ich schlage vor, eine andere zu veröffentlichen, wenn es nicht funktioniert. Glückliche Kodierung. Prost!

+0

Ja, ich habe das gemacht. Aber mit meiner eigenen Modellklasse kann ich keinen Schlüssel für jeden Knoten bekommen, wie wir es von einem Snapshot erhalten. Deshalb versuche ich mit Snapshot. Gibt es eine Möglichkeit, wie wir den Schlüssel des Knotens mit unserer eigenen Klasse bekommen können (ohne Schlüssel für diesen Knoten als untergeordnet zu speichern) – Dhaval

+0

Sie könnten Ihre 'modelClass' mit einem' DataSnapshot' -Parameter versehen und das Parsen/Abrufen von Werte von der dataSnapshot von dort. :) –

+0

Kannst du mir bitte dabei helfen? Gibt es ein Beispiel oder kannst du mir ein Beispiel geben? – Dhaval

6

Das Problem ist DataSnapShot ist fehlt ein Argument Konstruktor, so dass Sie es nicht direkt so verwenden können.

Verwenden Sie stattdessen eine andere Modellklasse.

So:

Erstellen Sie Ihr eigenes Modell FriendlyMessage genannt:

public class FriendlyMessage { 

private String text; 
private String name; 

// Created constructor with no Arguments 
public FriendlyMessage() { 
} 

public FriendlyMessage(String text, String name) { 
    this.text = text; 
    this.name = name;  
} 

public String getText() { 
    return text; 
} 

public void setText(String text) { 
    this.text = text; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 
} 

Wichtigste, was wir Konstruktor ohne Argumente erstellt haben, die in DataSnapShot fehlte

HINWEIS: Die obige Modellklasse ist nur ein Beispiel für Sie, da Sie in Firebase neu sind. Sie können Ihre eigene Modellklasse mit Ihren eigenen Parametern und allen haben.

Die Verwendung es so für Ihre Firebase Recyclerview:

FirebaseRecyclerAdapter mFirebaseAdapter = new FirebaseRecyclerAdapter<FriendlyMessage, MyHolder>(
        FriendlyMessage.class, 
        R.layout.row_slots, 
        MyHolder.class, 
        databaseReference.child("slots").child(uid).child(dayOfWeek).child("time")) { 

     @Override 
     protected void populateViewHolder(MyHolder viewHolder, FriendlyMessage friendlyMessage, int position) 
     { 

     } 
    }; 

EDIT:

Es ist auch egal, wie Sie die Daten auf Datenbank drängen. Tun Sie es direkt mit Ihrer Modellklasse.

Zum Beispiel für obiges Modell es so schieben FriendlyMessage:

FriendlyMessage friendlyMessage = new FriendlyMessage("message", "Username"); 
databaseReference.child(MESSAGES_CHILD).push().setValue(friendlyMessage); 

Hier Ihr child() wird etwas anders sein als meine Implementierung es ist nur ein Beispiel.

für das Hören eines bestimmten DataSnapShot:

databaseReference.child("users").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
       //The PUSH ID OP WANTED 

       System.out.println("Push Id ---"+postSnapshot.getKey()); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }) 

die oben Zuhörer zu erklären. Es wird Ihnen das DataSnapShot Objekt für jeden Benutzer geben, der in Ihr Kind "Benutzer" fällt. Sie können Push ID von getKey() Methode zugreifen.

+0

kannst du ein Beispiel setzen, wie man ID drückt danke in ontadatachange –

Verwandte Themen