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

