2016-05-17 15 views
0

私は今、子供のための数学の教えるアプリであるはずのプロジェクトをやっています。 私は自分のデータベースとしてfirebaseを使ってユーザ名とパスワードを保存し、質問とその回答を保存しています。 質問とデータベースからの回答を取り戻し、ボタンとテキストビューに表示するのに問題があります。単一値イベントのリスナーは、クラスが他のすべてのコマンドで完了し、私が持っているすべての質問のこのリスナーです。アンドロイド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を使用してロジックを書き換える必要があります。その場合、あなたのデータはいつでも実際のものとなります。

関連する問題