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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:36:07