OnItemSelected当Spinner从Firebase获取阵列列表时,不会调用

OnItemSelected当Spinner从Firebase获取阵列列表时,不会调用

问题描述:

该应用通过OnDataChange从Firebase获取阵列列表并且有OnItemSelected,但不幸的是它不会调用。 (实际上微调者是从Firebase数据库中获取字符串的。) 我已经使用本地数组列表和OnItemSelected作品测试了代码。 为什么?OnItemSelected当Spinner从Firebase获取阵列列表时,不会调用

这些都是我的功能:

 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

微调器是否填充了数据列表?你不应该'Thread.sleep(4000);'如果这就是主要的。 –

+0

是的,你可以在这里看到完整的代码:https://pastebin.com/hSH0dfuB – WhiteNinja

+0

你正在做'Thead.sleep(4000);'在主线程上,你应该等待回调中的数据被加载。 –

最后,我已经找到了答案我自己。 Firebase功能以同步方式工作。我还没有找到改变这种方式的方法 - 以某种方式操纵它。 处理从Firebase函数接收的数据的答案是在for(从数据库收集信息)INSIDE onDataChange后,初始化所需的函数。 例如:

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) { 

     } 
    }); 
}