2017-07-13 6 views
0

Ich brauche eine klare Erklärung mit addChildEventListener und Query Ereignisbindung.Firebase Android addChildEventListener Erklärung

Ich benutze Feuerbasis in meinem Android-App. Im onCreate() Methode meiner Tätigkeit, schaffe ich so etwas wie dieses ...

fiDbQuery = fiDbRef.child("users").orderByChild("name"); 
fiDbQuery.addChildEventListener(// listener //); 

... wo fiDbQuery ist eine Query Instanz in der Tätigkeit (global var) und fiDbRef ist eine DatabaseReference Instanz in der Tätigkeit zu, wo ich schon den Anfangswert gesetzt habe.

alles in Ordnung ist, wenn die Aktivität zuerst geladen wird, werden alle Benutzer-Daten werden geladen und angezeigt. Aber dann habe ich einen Knopf, um diese Daten nach Benutzer-Feld zu sortieren, entweder per E-Mail, Alter, Name, etc.

und in diesen Tasten onClick Ereignis Listener, mache ich so etwas ... (dieser ist die Art von Alter Taste)

fiDbQuery = fiDbRef.child("users").orderByChild("age"); 

... und ich habe die addChildEventListener Funktion nicht zur Verfügung stellen, weil es bereits „hinzugefügt“ auf onCreate() Methode, nicht wahr? Die Daten werden nicht geladen, aber wenn ich die addChildEventListener Funktion hinzufüge, funktioniert es wieder.

Meine Frage ist, wird sie speichern addChildEventListener in einer Abfrage mehrere zu verwenden, oder gibt es irgendwelche Performance-Probleme mit dem? Alles, was ich will, ist die Wiederverwendung der fiDbQuery Instanz ohne die Notwendigkeit, addChildEventListener jedes Mal, wenn ich die fiDbQuery ändern.

Vielen Dank für Ihre Hilfe.

EDIT:

alle Abfrage ich den exakt gleichen Hörer verwenden machen. Nur ein Listener für alle Abfragen, die eine listView auffüllen.

Antwort

3

Sie brauchen nicht die addChildEventListener wieder hinzuzufügen. Was Sie tun müssen, ist, die Logik Ihrer Aktionen ein wenig zu ändern.

Zuerst alle Ihre Abfragen wie folgt definieren:

nameQuery = fiDbRef.child("users").orderByChild("name"); 
ageQuery = fiDbRef.child("users").orderByChild("age"); 
//and so on 

Ihr Problem zu lösen, müssen Sie nur eine if else-if statement verwenden müssen, die wie das klingt:

Query query; 
if(nameButton.isClicked()) { 
    query = nameQuery; 
} else if(ageButton.isClicked()) { 
    query = ageQuery; 
} 

query.addChildEventListener(// listener. //); 

Dies bedeutet, dass gemäß auf dem Knopf Der Klick wurde gemacht, Sie verwenden die gewünschte Abfrage. Mit diesem Code verwenden Sie einfach einmal die addChildEventListener.

Ich hoffe, es hilft.

+0

Gibt es alles in Ordnung, kann ich Ihnen mit Details helfen? –

+0

Es tut mir leid, ich kann SO heute nur überprüfen, und danke für Ihre Antwort. Aber ist das nicht anders, wenn die Anweisung immer aufgerufen werden muss, wenn eine Taste gedrückt wird? und wenn ja, ist es nicht dasselbe mit dem Aufruf von addChildEventListener, wenn eine Taste gedrückt wird, also mehrfaches hinzufügen? @Alex –

+0

Nein, die Bedingung für das Drücken der Schaltfläche ist in der 'if-else-if' Anweisung selbst. Ich habe diese' if-else-if' Anweisung erstellt, um entweder 'query = nameQuery' oder entweder' query aufzurufen = ageQuery'.Auf diese Weise rufen Sie die 'addChildEventListener()' Methode nur einmal auf. –

Verwandte Themen