按钮点击监听中ArrayList.clear()导致Firestore数据无法写入的问题排查
问题原因与解决方法
核心原因
不是ArrayList.clear()导致无法添加元素,而是Firestore的get()方法是异步执行的。你当前的代码逻辑是:点击按钮→清空集合→发起Firestore异步请求→立刻获取集合大小并弹出Toast。但此时异步请求还没完成,onSuccess回调里的元素添加操作根本没执行,所以你看到的集合大小始终是0。
解决方法
把获取集合大小、弹出Toast的逻辑,移到onSuccess回调内部,确保只有在数据加载完成后才执行这些操作。
修改后的点击事件代码:
Btn121.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { coursesArrayList21.clear(); db2.collection("Courses").get() .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() { @Override public void onSuccess(QuerySnapshot queryDocumentSnapshots){ if (!queryDocumentSnapshots.isEmpty()) { List<DocumentSnapshot> list = queryDocumentSnapshots.getDocuments(); for (DocumentSnapshot d : list) { Courses c = d.toObject(Courses.class); coursesArrayList21.add(c); } // 数据加载完成后再获取集合大小并提示 dummy1234 = coursesArrayList21.size(); Toast.makeText(MainActivity2.this, Integer.toString(dummy1234), Toast.LENGTH_SHORT).show(); // 如果该集合是RecyclerView的数据源,记得在此更新适配器 // adapter.notifyDataSetChanged(); } else { Toast.makeText(MainActivity2.this, "No data found in Database", Toast.LENGTH_SHORT).show(); // 空数据时集合大小为0,可在此明确提示 dummy1234 = 0; Toast.makeText(MainActivity2.this, Integer.toString(dummy1234), Toast.LENGTH_SHORT).show(); } } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Toast.makeText(MainActivity2.this, "Fail to get the data.", Toast.LENGTH_SHORT).show(); } }); } });
额外注意事项
- 确保
coursesArrayList21是全局初始化的实例(比如在Activity的onCreate方法中执行coursesArrayList21 = new ArrayList<>()),避免出现空指针异常。 - 如果后续要将这个集合用于UI展示(比如RecyclerView),必须在数据添加完成后调用适配器的
notifyDataSetChanged()方法,触发UI更新。
内容的提问来源于stack exchange,提问作者goksel demiradam
相关产品推荐
相关产品推荐

