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

Android中Firestore数据读取至Trade类后无法显示问题求助

问题分析与解决方案

核心问题:异步操作时序错误

Firestore的db.collection("Posts").get()是异步执行的,你调用getData()后立刻跳转MainActivity,此时Firestore还没完成数据读取和列表填充,MainActivity的onCreate方法中ListHandler.ListTrades仍是空集合,导致内容无法显示。

修复步骤

1. 调整数据加载完成后的跳转逻辑

修改onClick方法,等待Firestore数据加载完成后再启动MainActivity:

public void onClick(View v) {
    getData();
}

void getData(){
    db.collection("Posts").get().addOnCompleteListener(
        new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if(task.isSuccessful()){
                    // 每次加载前清空列表,避免重复数据
                    ListHandler.ListTrades.clear();
                    for(QueryDocumentSnapshot document : task.getResult() ){
                        Log.d(TAG, document.getId() + "=>" + document.getData());

                        Map<String, Object> data = document.getData();

                        String Name = (String) data.get("Name");
                        String Surname = (String) data.get("Surname");
                        String Phone = (String) data.get("Phone");
                        String Description = (String) data.get("Description");

                        if(Name != null ){
                            Trade Service = new Trade(Name,Surname,Phone,Description);
                            ListHandler.ListTrades.add(Service);
                        }else{
                            Log.d(TAG, "Got Bad Data for " + document.getId() + " => " + document.getId());
                        }
                    }
                    // 数据加载完成后再跳转
                    Intent Job = new Intent(Post.this,MainActivity.class);
                    startActivity(Job);
                }else{
                    Log.d(TAG, "Error getting document: ", task.getException());
                    Toast.makeText(Post.this, "数据加载失败", Toast.LENGTH_SHORT).show();
                    Intent Job = new Intent(Post.this,MainActivity.class);
                    startActivity(Job);
                }
            }
        });
}

2. 优化MainActivity的展示逻辑

使用Trade类的getter方法访问属性(符合封装规范),并改用StringBuilder提升拼接性能:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    txtDisplay = findViewById(R.id.txtDisplay);
    btnPost1 = findViewById(R.id.btnPost);
    
    btnPost1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent Job = new Intent(MainActivity.this,Post.class);
            startActivity(Job);
        }
    });

    if (!ListHandler.ListTrades.isEmpty()) {  
        StringBuilder textBuilder = new StringBuilder();
        for (Trade output: ListHandler.ListTrades) {
            textBuilder.append(output.getName())
                .append("\n")
                .append(output.getSurname())
                .append("\n")
                .append(output.getPhone())
                .append("\n")
                .append(output.getDescription())
                .append("\n\n");
        }
        txtDisplay.setText(textBuilder.toString());
    }
}

3. 额外检查点

  • 确认Firestore中Posts集合的字段名和代码中"Name"、"Surname"等完全一致(大小写敏感),字段不匹配会导致属性值为null,无法添加到列表。
  • 避免静态列表的长期持有问题,后续可考虑用LiveData或ViewModel替代静态集合,更符合Android架构规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:05:18