0

i am trying to fetch data from 5 different childs randomly to arrayList. My firebase database looks like this:

"Quiz": {
    "Level_1": {
      "Theme_1": [
        null,
        {
          "answerText": "1",
          "imgToken": "img1-1",
          "option1Text": "Warshaw",
          "option2Text": "Brelin",
          "option3Text": "Paris",
          "option4Text": "Prague",
          "questionID": 1,
          "questionText": "What is the capital of Poland ?"
        },
        {
           "answerText": "3",
          "imgToken": "img1-2",
          "option1Text": "Oslo",
          "option2Text": "Helsinky",
          "option3Text": "Budapest",
          "option4Text": "Wiena",
          "questionID": 2,
          "questionText": "What is the capital of Hungary ?"
        },
 

...continues to question n.10

I have there 5 Levels with 5 themes in them and each theme contains 10 questions. Is there any way how to get randomly 1 question from each 5 themes from 1 level to ArrayList in Android Studio using Java ?

I tried to get all 10 questions from theme 1 to ArrayList, then do Collections.shuffle and add question from 0th position to new ArrayList which i am using in the quiz but it is too complicated and if there would be more than 5 level, or more than 5 themes it will crash or will not work.

Also this code looks terrible and i think could be written better.

databaseReference.child("Quiz").child("Level_1").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        for (DataSnapshot questions : snapshot.child("Theme_1").getChildren()){

            String getQuestion = questions.child("questionText").getValue(String.class);
            String getOption1 = questions.child("option1Text").getValue(String.class);
            String getOption2 = questions.child("option2Text").getValue(String.class);
            String getOption3 = questions.child("option3Text").getValue(String.class);
            String getOption4 = questions.child("option4Text").getValue(String.class);
            String getAnswer = questions.child("answerText").getValue(String.class);
            String imgToken = questions.child("imgToken").getValue(String.class);

            QuestionsList questionslist = new QuestionsList(getQuestion, getOption1, getOption2, getOption3, getOption4, getAnswer, imgToken);
            theme1List.add(questionslist);
            Collections.shuffle(theme1List);
        }

        for (DataSnapshot questions : snapshot.child("Theme_2").getChildren()){
            String getQuestion = questions.child("questionText").getValue(String.class);
            String getOption1 = questions.child("option1Text").getValue(String.class);
            String getOption2 = questions.child("option2Text").getValue(String.class);
            String getOption3 = questions.child("option3Text").getValue(String.class);
            String getOption4 = questions.child("option4Text").getValue(String.class);
            String getAnswer = questions.child("answerText").getValue(String.class);
            String imgToken = questions.child("imgToken").getValue(String.class);

            QuestionsList questionslist = new QuestionsList(getQuestion, getOption1, getOption2, getOption3, getOption4, getAnswer, imgToken);
            theme2List.add(questionslist);
            Collections.shuffle(theme2List);
        }

        for (DataSnapshot questions : snapshot.child("Theme_3").getChildren()){
            String getQuestion = questions.child("questionText").getValue(String.class);
            String getOption1 = questions.child("option1Text").getValue(String.class);
            String getOption2 = questions.child("option2Text").getValue(String.class);
            String getOption3 = questions.child("option3Text").getValue(String.class);
            String getOption4 = questions.child("option4Text").getValue(String.class);
            String getAnswer = questions.child("answerText").getValue(String.class);
            String imgToken = questions.child("imgToken").getValue(String.class);

            QuestionsList questionslist = new QuestionsList(getQuestion, getOption1, getOption2, getOption3, getOption4, getAnswer, imgToken);
            theme3List.add(questionslist);
            Collections.shuffle(theme3List);
        }

        for (DataSnapshot questions : snapshot.child("Theme_4").getChildren()){
            String getQuestion = questions.child("questionText").getValue(String.class);
            String getOption1 = questions.child("option1Text").getValue(String.class);
            String getOption2 = questions.child("option2Text").getValue(String.class);
            String getOption3 = questions.child("option3Text").getValue(String.class);
            String getOption4 = questions.child("option4Text").getValue(String.class);
            String getAnswer = questions.child("answerText").getValue(String.class);
            String imgToken = questions.child("imgToken").getValue(String.class);

            QuestionsList questionslist = new QuestionsList(getQuestion, getOption1, getOption2, getOption3, getOption4, getAnswer, imgToken);
            theme4List.add(questionslist);
            Collections.shuffle(theme4List);
        }

        for (DataSnapshot questions : snapshot.child("Theme_5").getChildren()){
            String getQuestion = questions.child("questionText").getValue(String.class);
            String getOption1 = questions.child("option1Text").getValue(String.class);
            String getOption2 = questions.child("option2Text").getValue(String.class);
            String getOption3 = questions.child("option3Text").getValue(String.class);
            String getOption4 = questions.child("option4Text").getValue(String.class);
            String getAnswer = questions.child("answerText").getValue(String.class);
            String imgToken = questions.child("imgToken").getValue(String.class);

            QuestionsList questionslist = new QuestionsList(getQuestion, getOption1, getOption2, getOption3, getOption4, getAnswer, imgToken);
            theme5List.add(questionslist);
            Collections.shuffle(theme5List);
        }

        questionslists.add(0,theme1List.get(0));
        questionslists.add(1,theme2List.get(0));
        questionslists.add(2,theme3List.get(0));
        questionslists.add(3,theme4List.get(0));
        questionslists.add(4,theme5List.get(0));

        Collections.shuffle(questionslists);
        totalQuestionTV.setText("/"+questionslists.size());
        total = questionslists.size();
        startQuizTimer();

        selectQuestion(currentQuestionPosition);

    }
    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        Toast.makeText(MainActivity.this, "Failed", Toast.LENGTH_SHORT).show();
    }
});
Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
Stan271937
  • 35
  • 4
  • Did you see this [answer](https://stackoverflow.com/questions/50413117/how-to-get-unique-random-product-in-node-firebase/50413208)? – Alex Mamo Mar 22 '23 at 11:31
  • I do not understand what this do: ArrayAdapter arrayAdapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, randomProductList); listView.setAdapter(arrayAdapter); – Stan271937 Mar 22 '23 at 12:34

1 Answers1

0

It looks like you've copy/pasted the same block of code 4 times. In cases like that, you can typically use a loop to accomplish the same result without copy/paste.

databaseReference.child("Quiz").child("Level_1").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        for (int theme=1; theme <= 5; theme++) { // 
            for (DataSnapshot questions : snapshot.child("Theme_"+theme).getChildren()) {
                String getQuestion = questions.child("questionText").getValue(String.class);
                String getOption1 = questions.child("option1Text").getValue(String.class);
                String getOption2 = questions.child("option2Text").getValue(String.class);
                String getOption3 = questions.child("option3Text").getValue(String.class);
                String getOption4 = questions.child("option4Text").getValue(String.class);
                String getAnswer = questions.child("answerText").getValue(String.class);
                String imgToken = questions.child("imgToken").getValue(String.class);
    
                QuestionsList questionslist = new QuestionsList(getQuestion, getOption1, getOption2, getOption3, getOption4, getAnswer, imgToken);
                theme1List.add(questionslist);
                Collections.shuffle(theme1List);
    
                questionslists.add(theme-1, theme1List.get(0)); // 
            }
        }

        Collections.shuffle(questionslists);
        totalQuestionTV.setText("/"+questionslists.size());
        total = questionslists.size();
        startQuizTimer();

        selectQuestion(currentQuestionPosition);
    }
    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        Toast.makeText(MainActivity.this, "Failed", Toast.LENGTH_SHORT).show();
    }
});
Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
  • Thanks for answer but instead of getting just 5 questions it gave me all questions, in this case 50 – Stan271937 Mar 24 '23 at 07:54
  • First off: is the approach that I take in my code clear, and how the additional `for` loop works to prevent having to copy/paste the same code multiple times? – Frank van Puffelen Mar 24 '23 at 15:11