You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android Studio中从Firebase实时数据库各主题随机取题到ArrayList?

解决方案:从Firebase实时数据库多Theme中随机抽取题目

需求回顾

需要从Firebase实时数据库指定Level下的5个Theme中,每个Theme随机抽取1道题目存入ArrayList,同时优化原有冗余代码,提升扩展性。

数据库结构示例:

"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 ?"
        },
        // 剩余题目...
      ],
      // 其他Theme...
    }
}

优化后的实现代码

1. 封装题目解析工具方法

将重复的题目解析逻辑封装为单独方法,避免代码冗余:

private QuestionsList parseQuestion(DataSnapshot questionSnapshot) {
    String questionText = questionSnapshot.child("questionText").getValue(String.class);
    String option1 = questionSnapshot.child("option1Text").getValue(String.class);
    String option2 = questionSnapshot.child("option2Text").getValue(String.class);
    String option3 = questionSnapshot.child("option3Text").getValue(String.class);
    String option4 = questionSnapshot.child("option4Text").getValue(String.class);
    String answer = questionSnapshot.child("answerText").getValue(String.class);
    String imgToken = questionSnapshot.child("imgToken").getValue(String.class);
    return new QuestionsList(questionText, option1, option2, option3, option4, answer, imgToken);
}

2. 简化Firebase数据读取逻辑

遍历指定Level下的所有Theme节点,动态处理每个Theme的随机抽题:

// 目标Level,可根据需求动态传入
String targetLevel = "Level_1";
databaseReference.child("Quiz").child(targetLevel).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        ArrayList<QuestionsList> questionslists = new ArrayList<>();
        Random random = new Random();

        // 遍历当前Level下的所有Theme节点
        for (DataSnapshot themeSnapshot : snapshot.getChildren()) {
            // 获取当前Theme下的所有有效题目(过滤空元素)
            List<DataSnapshot> questionSnapshots = new ArrayList<>();
            for (DataSnapshot qSnapshot : themeSnapshot.getChildren()) {
                if (qSnapshot.exists() && qSnapshot.getValue() != null) {
                    questionSnapshots.add(qSnapshot);
                }
            }

            // 随机抽取一道题目加入结果列表
            if (!questionSnapshots.isEmpty()) {
                int randomIndex = random.nextInt(questionSnapshots.size());
                QuestionsList randomQuestion = parseQuestion(questionSnapshots.get(randomIndex));
                questionslists.add(randomQuestion);
            }
        }

        // 打乱最终题目顺序(可选操作)
        Collections.shuffle(questionslists);

        // 后续业务逻辑
        totalQuestionTV.setText("/" + questionslists.size());
        total = questionslists.size();
        startQuizTimer();
        selectQuestion(currentQuestionPosition);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        Toast.makeText(MainActivity.this, "数据加载失败", Toast.LENGTH_SHORT).show();
    }
});

优化点说明

  • 动态适配Theme数量:通过遍历snapshot.getChildren()获取所有Theme,后续新增Theme无需修改代码
  • 减少冗余代码:将重复的解析逻辑封装,避免多次编写相同代码块
  • 高效随机抽题:直接收集有效题目后随机选索引,无需加载全量题目再打乱,节省内存与性能
  • 空值安全处理:过滤Theme数组中的null元素,避免空指针异常

内容的提问来源于stack exchange,提问作者Stan271937

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 06:32:23