2017-05-09 24 views
1

Ich versuche, die in Firebase gespeicherten Daten im Dropdown-Menü von AutoCompleteTextView anzuzeigen. Zu diesem Zweck verwende ich den ValueEventListener. Gemäß der Dokumentation von ValueEventListener,ValueEventListener funktioniert nicht wie erwartet

Sie können die OnDataChange() Methode verwenden, um eine statische Momentaufnahme der Inhalte zu einem bestimmten Pfad zu lesen, da sie zum Zeitpunkt der Veranstaltung bestanden. Diese Methode wird einmal ausgelöst, wenn der Listener angeschlossen ist, und erneut jedes Mal, wenn sich die Daten, einschließlich untergeordnete Elemente, ändern.

Leider in meinem Fall OnDataChange() wird nur dann ausgelöst, wenn die Daten der geändert wird (das heißt, wenn neue Daten hinzugefügt wird). Dies bedeutet, dass AutoCompleteTextView das Dropdown-Menü nicht anzeigt, ohne die Daten in Firebase zu ändern. Was ich will, ist für die onDataChange() zum ersten Mal auslösen, wenn der Listener aufgerufen wird und jedes Mal, wenn sich die Daten ändern. Ich würde gerne wissen, wo ich falsch liege. Der folgende Code erscheint innerhalb onCreateView von Fragment

daTags.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      //Basically, this says "For each DataSnapshot *Data* in dataSnapshot, do what's inside the method. 
      for (DataSnapshot tagNameSnapshot : dataSnapshot.getChildren()) { 
       //Get the suggestion by childing the key of the string you want to get. 
       String ValueTagName = tagNameSnapshot.child(getResources().getString(R.string.Child_AppData_Tags_TagName)).getValue(String.class); 
       //Add ValueTagName (Value pulled from Firebase for the above Key) to TagList 
       //Is better to use a List, because you don't know the size of the iterator returned by dataSnapshot.getChildren() to initialize the array 
       tagList.add(ValueTagName); 

       //Initialize AutoCompleteTextView and define Adapter 
       ArrayAdapter<String> adapterAutoComplete = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, tagList); 
       actv_tagName.setAdapter(adapterAutoComplete); 

       //Get TagsCount using dataSnapshot and display TagsCount in TextView 
       TagsCount = dataSnapshot.getChildrenCount() + ""; 
       tv_tagsCount.setText(TagsCount); 
      } 
     }); 

Dank

+0

Die 'onDataChange()' Methode wird tatsächlich einmal für die Anfangsdaten und dann wieder mit irgendwelchen Änderungen wie beschrieben ausgeführt. Ich vermute, dass das Problem mit AutoCompleteTextView und Adapter zu tun hat, obwohl ich keine Zeit habe, es zu testen. Versuchen Sie eine Log-Nachricht oder etwas in onDataChange zu setzen, um zu bestätigen, ob der onDataChange ausgeführt wird oder nicht. –

+0

'onDataChange() {}' liefert keine Anfangsdaten. Nach dem Ändern der vorhandenen Daten (Hinzufügen neuer Daten) in der entfernten Datenbank funktioniert das 'onDataChange() {}' jedoch wie erwartet (wie in der obigen Frage erwähnt). Ich würde gerne wissen, was die 'onDataChange() {}' verursacht, um die Anfangsdaten nicht zurückzugeben. – user3314337

+0

Wie haben Sie festgestellt, dass onDataChange beim ersten Mal nicht ausgelöst wird? –

Antwort

0

Ich glaube, ich das Problem verstanden. Damit es funktioniert, werde ich die folgenden Zeilen Code außerhalb der For-Schleife bewegen

ArrayAdapter<String> adapterAutoComplete = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, tagList); 
actv_tagName.setAdapter(adapterAutoComplete); 

Wenn innerhalb der For-Schleife wird der Adapter für jede Schleife aktualisiert. Platzieren Sie den obigen Code außerhalb For Schleife, beseitigt das Problem.

Verwandte Themen