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

如何在MPAndroidChart BarChart中点击按钮更新X/Y轴数据

解决MPAndroidChart BarChart数据与X轴标签同步更新问题

问题场景

使用MPAndroidChart的BarChart组件时,通过arrayList1存储X轴标签(如math、english),自定义ValueFormatter将X轴数值映射为对应标签;score_array存储Y轴分数数据,调用Set_BarChar_Data初始化图表。点击按钮需要替换X轴标签列表(如english、biology、c#)并更新对应Y轴数据,但当前操作无法实现X轴与Y轴数据的正确同步更新。

错误原因分析

  • score_array未清空直接追加数据,导致数据长度与新标签列表长度不匹配,BarEntry索引和标签索引错位
  • X轴的ValueFormatter依赖arrayList1,更新标签后未触发X轴格式刷新
  • 数据集合长度变化时,仅调用notifyDataChanged和notifyDataSetChanged无法让图表重新计算轴范围

修正方案

  1. 更新数据前清空arrayList1和score_array,确保两者长度严格对应
  2. 更新标签后,重新设置X轴的ValueFormatter,确保关联新标签列表
  3. 数据长度变化时,重新构建BarData并设置给图表,保证图表重新计算轴范围

修正后代码

初始设置代码

arrayList1.add("math");
arrayList1.add("english");
arrayList1.add("biology");
arrayList1.add("computer");
arrayList1.add("java");
arrayList1.add("c");
// 初始化分数数据
for (int i = 0; i < arrayList1.size(); i++) {
    score_array.add((float) 0);
}

// 设置X轴格式化器
ValueFormatter valueFormatter = new ValueFormatter() {
    @Override
    public String getFormattedValue(float value) {
        if (value >= 0 && value < arrayList1.size()) {
            return arrayList1.get((int) value);
        } else {
            return "";
        }
    }
};
xAxis.setValueFormatter(valueFormatter);

arrayList_BarEntry = Set_BarChar_Data(score_array, null);

按钮点击触发代码

// 清空旧数据和标签
arrayList1.clear();
score_array.clear();

// 添加新标签
arrayList1.add("english");
arrayList1.add("biology");
arrayList1.add("c#");
arrayList1.add("python");
arrayList1.add("biology");
arrayList1.add("math");

// 添加对应新分数数据(示例为100,可替换为实际需求数据)
for (int i = 0; i < arrayList1.size(); i++) {
    score_array.add((float) 100);
}

// 重新设置X轴格式化器,关联新标签列表
xAxis.setValueFormatter(new ValueFormatter() {
    @Override
    public String getFormattedValue(float value) {
        if (value >= 0 && value < arrayList1.size()) {
            return arrayList1.get((int) value);
        } else {
            return "";
        }
    }
});

arrayList_BarEntry = Set_BarChar_Data(score_array, null);

Set_BarChar_Data方法代码

ArrayList<BarEntry> Set_BarChar_Data(@NotNull ArrayList<Float> score_array, @Nullable Integer high_position) {
    ArrayList<BarEntry> values = new ArrayList<>();
    for (int i = 0; i < score_array.size(); i++) {
        values.add(new BarEntry((float) i, score_array.get(i)));
    }

    BarDataSet set1;
    if (teacher_score_barchart.getData() != null &&
            teacher_score_barchart.getData().getDataSetCount() > 0) {
        set1 = (BarDataSet) teacher_score_barchart.getData().getDataSetByIndex(0);
        set1.setValues(values);
        if (high_position != null) {
            set1.setHighLightColor(lessons_colors.get(high_position));
        }
        // 数据长度变化时,重新设置BarData确保轴范围更新
        BarData newData = new BarData(set1);
        teacher_score_barchart.setData(newData);
        teacher_score_barchart.setFitBars(true);
    } else {
        set1 = new BarDataSet(values, "score");
        set1.setColors(lessons_colors);
        set1.setDrawValues(false);
        ArrayList<IBarDataSet> dataSets = new ArrayList<>();
        dataSets.add(set1);
        BarData data = new BarData(dataSets);
        teacher_score_barchart.setData(data);
        teacher_score_barchart.setFitBars(true);
    }

    // 强制刷新图表
    teacher_score_barchart.invalidate();
    teacher_score_barchart.animateXY(1000, 1000);
    return values;
}

内容的提问来源于stack exchange,提问作者tong xi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:37:15