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

Collections.shuffle(list)无法打乱Firebase加载的题目列表问题

解决Firebase异步加载题目后无法打乱列表的问题

我来帮你搞定这个问题!你遇到的核心矛盾完全是Firebase异步加载特性导致的,咱们一步步拆解修复。

问题根因分析

你当前的代码里,Collections.shuffle(Common.questionList)是直接写在addValueEventListener外面的,但Firebase的数据库查询是异步操作——程序调用addValueEventListener后,不会等着数据加载完成,而是立刻往下执行shuffle逻辑。这时候Common.questionList要么是空的,要么还没填充完有效题目,自然打乱不了你想要的列表。

修复方案

把打乱列表的代码移到onDataChange方法内部,也就是等所有数据都加载完成并填充到列表之后,再执行打乱操作。这样就能保证shuffle作用在已经有完整数据的列表上了。

修改后的代码

Start.java

private void loadQuestion(String categoryId) {
    // 先清空旧题目列表
    if(Common.questionList.size() > 0) 
        Common.questionList.clear();

    questions.orderByChild("CategoryId").equalTo(categoryId)
            .addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                        Question ques = postSnapshot.getValue(Question.class);
                        Common.questionList.add(ques);
                    }
                    // 数据加载完成后再打乱列表!
                    Collections.shuffle(Common.questionList);
                    // 如果需要刷新UI(比如显示第一题),相关逻辑也要放在这里执行
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    // 这里可以添加错误处理,比如给用户提示加载失败
                }
            });
}

补充说明

  • Common.java的列表初始化是没问题的,无需修改:
public class Common {
    public static String categoryId;
    public static User currentUser;
    public static List<Question> questionList = new ArrayList<>();
}
  • 额外提醒:如果后续需要基于打乱后的列表做UI渲染(比如展示题目),相关代码也必须放在onDataChange内部或者由这里触发,否则会再次遇到异步顺序问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:06:32