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

Android Studio统计Firebase文档plastic出现次数并展示到MPChart的实现问题

问题原因
  • 核心是Firebase的Firestore查询属于异步操作:你在onCreate中调用getMultipleDocs()后,代码不会等待网络请求返回结果,会直接执行后续的图表初始化逻辑,此时全局变量Plastic还没有被赋值,自然拿不到正确的统计值。
  • 其次你的统计逻辑有误:Plastic++只会给变量加1,你需要的是匹配条件的文档总数量,直接取返回结果的size()即可,不需要逐个遍历计数。
修正实现方案

你只需要把图表数据生成、赋值的逻辑移到Firebase请求成功的回调里执行即可,修正后代码如下:

// 首先确认你的MainChart继承AppCompatActivity
public class MainChart extends AppCompatActivity {
    BarChart barChart;
    int Plastic;
    // 替换为你自己的TAG
    private static final String TAG = "MainChartLog";
    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chart);
        // 先初始化图表控件,id和你布局文件里的保持一致
        barChart = findViewById(R.id.barChart);
        getMultipleDocs();
        // 不要在这里初始化图表数据,此时网络请求还没有返回
    }

    public void getMultipleDocs() {
        FirebaseFirestore.getInstance()
                .collection("Garbage")
                .whereEqualTo("name","plastic")
                .get()
                .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                    @Override
                    public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                        // 直接获取匹配条件的文档总数
                        Plastic = queryDocumentSnapshots.size();
                        Log.d(TAG, "plastic have = " + Plastic);
                        // 请求成功后再初始化更新图表
                        initBarChart();
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.e(TAG, "onFailure: ", e);
                        // 网络请求失败可以做兜底处理
                        Plastic = 0;
                        initBarChart();
                    }
                });
    }

    public ArrayList<BarEntry> data(){
        ArrayList<BarEntry> dataVal = new ArrayList<>();
        dataVal.add(new BarEntry(0,Plastic));
        return dataVal;
    }

    // 单独抽取图表初始化逻辑
    private void initBarChart() {
        ArrayList<BarEntry> dataValues = data();
        // 第二个参数是柱状图的图例标签,可自行修改
        BarDataSet barDataSet = new BarDataSet(dataValues, "塑料类垃圾数量");
        BarData barData = new BarData(barDataSet);
        // 可自行设置柱子颜色、文字大小等样式
        barDataSet.setColor(Color.parseColor("#FF6200EE"));
        barChart.setData(barData);
        barChart.invalidate();
    }
}
额外说明
  • 如果你后续需要统计多个类别的垃圾数量,只需要在回调里分别拿到对应类别的计数,再统一添加到BarDataSet的数据源即可。
  • 可以给图表加加载状态提示,避免用户在网络请求返回前看到空白界面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:45:00