Android Spinner选中数据首次传递失败 Firestore数据首次加载不显示
问题原因
- 核心问题出在
ListActivity的getData()方法的异步逻辑处理错误:Firestore的addSnapshotListener是异步网络请求,你将adapter.notifyDataSetChanged()写在了监听的外部,调用该方法时Firebase还没有返回数据,列表自然为空。第二次进入页面时,上一次的异步请求已经把数据存到了paketArrayList中,所以能正常显示。 - 额外隐患:Snapshot每次回调时没有清空原有列表数据,后续会出现数据重复叠加的问题;delete方法存在数组越界、删除对象错误的逻辑问题。
修复方案
1. 修改ListActivity的getData()方法
将刷新列表的逻辑移到异步回调内部,每次加载数据前清空原有列表:
public void getData(){ firebaseFirestore.collection(magaza).addSnapshotListener(new EventListener<QuerySnapshot>() { @Override public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) { if (error!=null){ Toast.makeText(ListActivity.this,error.getLocalizedMessage(),Toast.LENGTH_LONG).show(); }else if (value!=null){ // 先清空原有数据,避免重复 paketArrayList.clear(); for (DocumentSnapshot documentSnapshot:value.getDocuments()){ Map<String,Object> data = documentSnapshot.getData(); name = (String) data.get("name"); String paketSayisi = (String) data.get("paketSayisi"); String angaryaSayisi = (String) data.get("angaryaSayisi"); Paket paket = new Paket(name,paketSayisi,angaryaSayisi); paketArrayList.add(paket); } // 数据加载完成后再通知列表刷新 adapter.notifyDataSetChanged(); } } }); }
2. 修正delete方法逻辑
原方法循环条件越界,且全局变量name只会保留最后一条数据的名称,无法正确删除选中条目,建议在适配器中添加条目点击逻辑拿到对应要删除的对象id后再执行删除操作,临时修正参考:
public void delete(View view){ // 示例仅做逻辑修正,实际使用建议结合列表选中逻辑指定要删除的文档 for (int i=0;i < paketArrayList.size();i++){ Paket currentPaket = paketArrayList.get(i); firebaseFirestore.collection(magaza).document(currentPaket.name).delete() .addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void unused) { Toast.makeText(ListActivity.this,"SİLİNDİ",Toast.LENGTH_LONG).show(); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Toast.makeText(ListActivity.this,e.getLocalizedMessage(),Toast.LENGTH_LONG).show(); } }); } }
内容的提问来源于stack exchange,提问作者zartVader
相关产品推荐
相关产品推荐

