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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:45:23