2016-05-17 71 views
0

我正在做一个项目,现在应该是一个数学教学应用程序的孩子。 我使用firebase作为我的数据库来保存用户名和密码,并保存问题和答案。 我有一个问题,从数据库中提取问题和答案,并将其显示在按钮和textview上,因为它显示只有当类完成所有其他命令时才会触发单值事件的侦听器,而且我需要使用这是我听到的每个问题的听众。android firebase检索数据不止一次

我的数据库: enter image description here

到目前为止我的代码:

ArrayList <Integer> list = new ArrayList<Integer>(); 
    for (int i=1; i<11; i++) { 
     list.add(new Integer(i)); 
    } 
    Collections.shuffle(list); 

    for (int i=0; i<5; i++) { 
     ref2 = ref.child(list.get(i).toString()); 
     Questions.cont = false; 
     getQuestionsFromDb(ref2); 

     questionView.setText(Questions.question); 
     button1.setText(Questions.ans1); 
     button2.setText(Questions.ans2); 
     button3.setText(Questions.ans3); 
     button4.setText(Questions.ans4); 

     button1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Questions.cont = true; 
       int ans = getAns(Questions.question); 
       Button b = (Button)v; 
       int buttonText = Integer.parseInt(b.getText().toString()); 
       if(ans == buttonText) { 
        Questions.points++; 
       } 
      } 
     }); 
      } 
     questionView.setText(Questions.points); 

     // end of for loop 
    } 
private void getQuestionsFromDb(Firebase ref2) { 
    // TODO Auto-generated method stub 

    ref2.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 
     System.out.println("aaa"); 
      String question = (String) snapshot.child("question").getValue(); 
      String ans1 = snapshot.child("ans1").getValue().toString(); 
      String ans2 = snapshot.child("ans2").getValue().toString(); 
      String ans3 = snapshot.child("ans3").getValue().toString(); 
      String ans4 = snapshot.child("ans4").getValue().toString(); 
      Questions.question = question; 
      Questions.ans1 = ans1; 
      Questions.ans2 = ans2; 
      Questions.ans3 = ans3; 
      Questions.ans4 = ans4; 
     } 
     @Override 
     public void onCancelled(FirebaseError arg0) { 
      // TODO Auto-generated method stub 
     } 
    }); 
} 

private int getAns(String ansString) { 
    // TODO Auto-generated method stub 
    String[] parts = ansString.split("\\b"); 
    String ans; 
    if(parts.length == 5) { 
     ans = parts[0] + parts[1] + parts[2] + parts [3] + parts [4]; 
    } 
    else { 
     ans = parts[0] + parts[1] + parts[2]; 
    } 
    return Integer.parseInt(ans); 
} 

正如你可以看到我还使用具有静态变量,用以保存的问题和答案外部类和把它们用于内部课堂。

我希望有人能帮忙。

+0

欢迎来到奇妙的异步编程世界。由于所有的firebase函数都是异步的,这意味着程序的其余部分不会等待它完成。看看[这个答案](http://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener/33204705#33204705) –

+0

什么是问题? –

回答

0

在你的情况下,你应该添加更多的侦听器addListenerForSingleValueEvent()来获得你需要的所有数据或者使用addValueEventListener重写你的逻辑。在这种情况下,您的数据在任何时候都是实际的。