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() { // 这里可以添加你的问候语逻辑 } }
问题排查与解决说明
异步数据获取顺序问题
原代码中先给rawData赋值、初始化图表,再调用getJanData(),但Firebase数据获取是异步操作,此时数据还未返回,图表用的是默认空值。解决办法是把图表更新逻辑移到onDataChange回调中,确保拿到数据后再渲染图表。变量缺失与Y轴设置错误
- 补充了未声明的
monthJanuary变量,避免编译错误 - 修正了Y轴范围设置错误:原代码重复调用
setAxisMaximum,改为setAxisMinimum(0f)保证Y轴从0开始
- 补充了未声明的
额外验证建议
可以在onDataChange中添加日志打印,确认是否成功获取到Firebase数据:Log.d("FirebaseDebug", "获取到的一月数据:" + value);同时检查Firebase数据库的节点路径
Monthly History/January是否正确,以及该节点存储的是否为Float类型数据,确保应用有数据库读取权限。
内容的提问来源于stack exchange,提问作者Greedy Ban
相关产品推荐
相关产品推荐

