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

Android Studio项目:Firebase数据无法填充BarChart求助

问题:Firebase数据无法填充BarChart,图表始终为空

我在Android Studio项目中尝试将Firebase数据库中的数据作为BarChart的输入,但始终无法成功,图表一直为空。应用运行过程中没有报错,已经尝试多种方法仍未解决,附上相关代码,恳请帮忙排查。

相关代码

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;

import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;

import com.example.greenerthumb.databinding.ActivityTrackingHistoryBinding;
import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.formatter.IndexAxisValueFormatter;
import com.github.mikephil.charting.utils.ColorTemplate;
import com.google.android.material.navigation.NavigationView;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import org.w3c.dom.Text;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;

public class TrackingHistory extends AppCompatActivity {
    ActivityTrackingHistoryBinding binding;
    DrawerLayout drawerLayout;
    NavigationView navigationView;
    ActionBarDrawerToggle drawerToggle;
    private TextView greetingsTxt;

    FirebaseDatabase firebaseDatabase;
    DatabaseReference databaseReference;
    // 补充缺失的变量声明
    private float monthJanuary = 0f;

    private List<String> monthValues = Arrays.asList("January","February","March","April", "May", "June", "July", "August","September","October","November","December");

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if (drawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityTrackingHistoryBinding.inflate(getLayoutInflater());
        setContentView(R.layout.activity_tracking_history);

        greetingsTxt = findViewById(R.id.greetings);
        showGreetings();

        firebaseDatabase = FirebaseDatabase.getInstance();
        databaseReference = firebaseDatabase.getReference("Monthly History").child("January");
        // 直接调用数据获取方法,数据返回后自动更新图表
        getJanData();
    }

    private void getJanData() {
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                Float value = snapshot.getValue(Float.class);
                if (value != null) {
                    monthJanuary = value;
                    // 获取到数据后更新图表
                    updateBarChart();
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Toast.makeText(TrackingHistory.this,"Failed to get data.",Toast.LENGTH_SHORT).show();
            }
        });
    }

    // 单独封装图表更新逻辑
    private void updateBarChart() {
        BarChart barChart = findViewById(R.id.historyMonth);
        barChart.getAxisRight().setDrawLabels(false);

        ArrayList<BarEntry> entries1 = new ArrayList<>();
        entries1.add(new BarEntry(0, monthJanuary));

        YAxis yAxis = barChart.getAxisLeft();
        // 修正Y轴范围设置错误(原代码重复设置了maximum)
        yAxis.setAxisMinimum(0f);
        yAxis.setAxisMaximum(500f);
        yAxis.setAxisLineWidth(2f);
        yAxis.setAxisLineColor(Color.BLACK);
        yAxis.setLabelCount(10);

        BarDataSet dataSet = new BarDataSet(entries1, "MONTH");
        dataSet.setColors(ColorTemplate.MATERIAL_COLORS);

        BarData barData = new BarData(dataSet);
        barChart.setData(barData);

        barChart.getDescription().setEnabled(false);
        barChart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(monthValues));
        barChart.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM);
        barChart.getXAxis().setGranularity(1f);
        barChart.getXAxis().setGranularityEnabled(true);
        barChart.animateY(5000);
        barChart.animateX(5000);

        // 刷新图表
        barChart.invalidate();
    }

    // 补充缺失的showGreetings方法(原代码未实现)
    private void showGreetings() {
        // 这里可以添加你的问候语逻辑
    }
}

问题排查与解决说明

  1. 异步数据获取顺序问题
    原代码中先给rawData赋值、初始化图表,再调用getJanData(),但Firebase数据获取是异步操作,此时数据还未返回,图表用的是默认空值。解决办法是把图表更新逻辑移到onDataChange回调中,确保拿到数据后再渲染图表。

  2. 变量缺失与Y轴设置错误

    • 补充了未声明的monthJanuary变量,避免编译错误
    • 修正了Y轴范围设置错误:原代码重复调用setAxisMaximum,改为setAxisMinimum(0f)保证Y轴从0开始
  3. 额外验证建议
    可以在onDataChange中添加日志打印,确认是否成功获取到Firebase数据:

    Log.d("FirebaseDebug", "获取到的一月数据:" + value);
    

    同时检查Firebase数据库的节点路径Monthly History/January是否正确,以及该节点存储的是否为Float类型数据,确保应用有数据库读取权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 10:04:54