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
相关产品推荐
相关产品推荐

