Android Studio中Firebase数据转图表:月份转数字与X轴显示月份名
解决方案
一、月份名称转数字X轴值
可以创建月份名称与数字的映射表,从Firebase读取数据时,根据节点的月份名称匹配对应数字:
// 定义月份映射:键是Firebase里的月份名称,值是对应的数字 private HashMap<String, Float> monthToNumberMap = new HashMap<String, Float>() {{ put("January", 1f); put("February", 2f); put("March", 3f); put("April", 4f); put("May", 5f); put("June", 6f); put("July", 7f); put("August", 8f); put("September", 9f); put("October", 10f); put("November", 11f); put("December", 12f); }};
读取Firebase数据时,通过节点key获取月份数字并生成柱状图数据:
// 监听IncomeData数据 gIncomeDatabase.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { ArrayList<BarEntry> values1 = new ArrayList<>(); for (DataSnapshot monthSnapshot : snapshot.getChildren()) { String monthName = monthSnapshot.getKey(); Float monthNumber = monthToNumberMap.get(monthName); float incomeAmount = monthSnapshot.getValue(Float.class); values1.add(new BarEntry(monthNumber, incomeAmount)); } set1.setValues(values1); barinc.notifyDataSetChanged(); barinc.invalidate(); } @Override public void onCancelled(@NonNull DatabaseError error) { // 处理读取失败逻辑 } }); // 同理监听ExpenseData数据 gExpenseDatabase.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { ArrayList<BarEntry> values2 = new ArrayList<>(); for (DataSnapshot monthSnapshot : snapshot.getChildren()) { String monthName = monthSnapshot.getKey(); Float monthNumber = monthToNumberMap.get(monthName); float expenseAmount = monthSnapshot.getValue(Float.class); values2.add(new BarEntry(monthNumber, expenseAmount)); } set2.setValues(values2); barinc.notifyDataSetChanged(); barinc.invalidate(); } @Override public void onCancelled(@NonNull DatabaseError error) { // 处理读取失败逻辑 } });
二、X轴下方显示月份名称
使用MPAndroidChart的XAxisValueFormatter自定义X轴显示内容,将数字转换为对应月份名称:
// 定义月份数组,索引对应数字(数字1对应索引0) private String[] monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; // 配置X轴 XAxis xAxis = barinc.getXAxis(); xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); // 设置X轴在底部 xAxis.setValueFormatter(new ValueFormatter() { @Override public String getAxisLabel(float value, AxisBase axis) { int index = (int) value - 1; if (index >= 0 && index < monthNames.length) { return monthNames[index]; } return ""; } });
完整代码整合示例
// 全局变量 private DatabaseReference gIncomeDatabase, gExpenseDatabase; private BarChart barinc; private BarDataSet set1, set2; private HashMap<String, Float> monthToNumberMap; private String[] monthNames; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); barinc = findViewById(R.id.barinc); String uid = FirebaseAuth.getInstance().getCurrentUser().getUid(); gIncomeDatabase = FirebaseDatabase.getInstance().getReference().child("IncomeData").child(uid); gExpenseDatabase = FirebaseDatabase.getInstance().getReference().child("ExpenseData").child(uid); initMonthConfig(); initBarChart(); } private void initMonthConfig() { monthToNumberMap = new HashMap<String, Float>() {{ put("January", 1f); put("February", 2f); put("March", 3f); put("April", 4f); put("May", 5f); put("June", 6f); put("July", 7f); put("August", 8f); put("September", 9f); put("October", 10f); put("November", 11f); put("December", 12f); }}; monthNames = new String[]{"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; } private void initBarChart() { ArrayList<BarEntry> values1 = new ArrayList<>(); ArrayList<BarEntry> values2 = new ArrayList<>(); set1 = new BarDataSet(values1, "Income"); set2 = new BarDataSet(values2, "Expense"); // 设置柱状图组间距 float groupSpace = 0.1f; float barSpace = 0.02f; float barWidth = 0.44f; BarData barData = new BarData(set1, set2); barData.setBarWidth(barWidth); barinc.setData(barData); barinc.groupBars(0f, groupSpace, barSpace); // 配置X轴 XAxis xAxis = barinc.getXAxis(); xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); xAxis.setValueFormatter(new ValueFormatter() { @Override public String getAxisLabel(float value, AxisBase axis) { int index = (int) value - 1; if (index >= 0 && index < monthNames.length) { return monthNames[index]; } return ""; } }); // 可选:隐藏默认描述、添加动画 barinc.getDescription().setEnabled(false); barinc.animateY(1000); } @Override public void onStart() { super.onStart(); gIncomeDatabase.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { ArrayList<BarEntry> values1 = new ArrayList<>(); for (DataSnapshot monthSnapshot : snapshot.getChildren()) { String monthName = monthSnapshot.getKey(); Float monthNum = monthToNumberMap.get(monthName); if (monthNum != null) { float amount = monthSnapshot.getValue(Float.class); values1.add(new BarEntry(monthNum, amount)); } } set1.setValues(values1); barinc.getData().notifyDataChanged(); barinc.notifyDataSetChanged(); barinc.invalidate(); } @Override public void onCancelled(@NonNull DatabaseError error) {} }); gExpenseDatabase.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { ArrayList<BarEntry> values2 = new ArrayList<>(); for (DataSnapshot monthSnapshot : snapshot.getChildren()) { String monthName = monthSnapshot.getKey(); Float monthNum = monthToNumberMap.get(monthName); if (monthNum != null) { float amount = monthSnapshot.getValue(Float.class); values2.add(new BarEntry(monthNum, amount)); } } set2.setValues(values2); barinc.getData().notifyDataChanged(); barinc.notifyDataSetChanged(); barinc.invalidate(); } @Override public void onCancelled(@NonNull DatabaseError error) {} }); }
内容的提问来源于stack exchange,提问作者ShyBee
相关产品推荐
相关产品推荐

