2017-10-19 26 views
0

L'application obtient une liste de tableau de Firebase via OnDataChange et a OnItemSelected, mais malheureusement, il n'appellera pas. (En fait, le spinner obtient les chaînes de la base de données Firebase.) J'ai testé le code avec un arraylist local et OnItemSelected fonctionne. Pourquoi?OnItemSelected ne pas appeler lorsque Spinner obtient arraylist de Firebase

Ce sont mes fonctions:

 public void initSpinner() { 

     restartAudioSpinner(); 


     try { 
      Thread.sleep(4000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(AddAudioItems.this, android.R.layout.simple_spinner_dropdown_item, categoriesTitle); 
     spinner.setAdapter(adapter); 
     spinner.setOnItemSelectedListener(this); 

    } 




    public void restartAudioSpinner() { 
     DatabaseReference database; 
     database = FirebaseDatabase.getInstance().getReference("Audio Categories"); 

     database.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       categorylist = new ArrayList<String>(); 

       for (DataSnapshot data :dataSnapshot.getChildren()) { 
        CategoryNew category = data.getValue(CategoryNew.class); 
        categoriesList.add(new CategoryNew(category.getImageUrl(),category.getTitle())); 
       } 

       for (int i = 0; i < categoriesList.size(); i++) { 
        categoriesTitle.add(categoriesList.get(i).getTitle()); 
       } 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
    } 

    @Override 
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
     Toast.makeText(AddAudioItems.this, categoriesTitle.get(i), Toast.LENGTH_SHORT).show(); 

    } 

    @Override 
    public void onNothingSelected(AdapterView<?> adapterView) { 
     Toast.makeText(AddAudioItems.this, "לא נבחרה שום רשומה, אנא בחר קטגוריה", Toast.LENGTH_SHORT).show(); 

    } 
+0

Le curseur est rempli avec la liste de données? Et vous ne devriez pas faire Thread.sleep (4000), si c'est sur le sujet principal. –

+0

Oui, vous pouvez voir le code complet ici: https://pastebin.com/hSH0dfuB – WhiteNinja

+0

Vous faites 'Thead.sleep (4000);' Sur le thread principal, vous devriez plutôt attendre les données dans le rappel quand il est chargé. –

Répondre

0

Finalement, je l'ai trouvé une réponse moi-même. Les fonctions Firebase fonctionnent de manière synchronisée. Je n'ai pas trouvé un moyen de changer ça - de le manipuler d'une manière ou d'une autre. La réponse de travailler avec des données reçues à partir d'une fonction Firebase est d'initialiser la fonction désirée APRÈS le pour (collecte de l'information de la base de données) INSIDE onDataChange. par exemple:

public void restartAudioSpinner() { 
    DatabaseReference database; 
    database = FirebaseDatabase.getInstance().getReference("Audio Categories"); 

    database.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      categorylist = new ArrayList<String>(); 

      for (DataSnapshot data :dataSnapshot.getChildren()) { 
       CategoryNew category = data.getValue(CategoryNew.class); 
       categoriesList.add(new CategoryNew(category.getImageUrl(),category.getTitle())); 
      } 

      for (int i = 0; i < categoriesList.size(); i++) { 
       categoriesTitle.add(categoriesList.get(i).getTitle()); 
      } 
       **// PUT THE DESIRED FUNCTION HERE!!!** EX: INIT THE SPINNER 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
}