如何在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
相关产品推荐
相关产品推荐

