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

Android MPAndroidChart设置X轴ValueFormatter触发数组越界异常求助

问题根源
  1. 无边界校验的索引访问:你在ValueFormatter的getAxisLabel方法里,直接将float类型的value强转为int去访问xLabels列表,完全没做边界判断。当value超出xLabels的有效索引范围时,直接触发ArrayIndexOutOfBoundsException。
  2. 中心刻度偏移导致索引错误:开启xAxis.setCenterAxisLabels(true)并配合groupBars使用时,X轴的刻度值会是偏移后的小数(比如0.5、1.5),强转int后会得到错误的标签索引。同时你设置xAxis.setAxisMaximum(storicoMacchina.size()),会让Chart尝试访问等于列表长度的索引(而xLabels的最大索引是size-1),直接触发越界。
修复步骤

1. 修正ValueFormatter,适配偏移+添加边界校验

修改你的格式化器实现,先适配中心刻度的偏移计算正确索引,再做边界校验:

ValueFormatter formatter = new ValueFormatter() {
    @Override
    public String getAxisLabel(float value, AxisBase axis) {
        // 适配centerAxisLabels的偏移,计算正确的标签索引
        int index = Math.round(value - 0.5f);
        // 确保索引在有效范围内,避免越界
        if (index >= 0 && index < xLabels.size()) {
            return xLabels.get(index);
        }
        // 超出范围返回空字符串,避免显示异常内容
        return "";
    }
};

2. 修正X轴最大值设置

原代码中直接设置axisMaximum=storicoMacchina.size()不符合分组后的X轴范围,改用barData的最大值动态计算,确保轴范围准确:

// 替换原有的xAxis.setAxisMaximum(storicoMacchina.size());
xAxis.setAxisMaximum(barData.getXMax() + groupSpace);

3. 确认xLabels初始化正确

确保xLabels是已初始化的ArrayList<String>,且循环中添加的元素数量与storicoMacchina.size()完全一致,避免因列表长度不匹配导致的越界。

关键修改后的代码片段
// 初始化xLabels(如果是全局变量请确保在循环前已初始化)
List<String> xLabels = new ArrayList<>();

// ... 循环填充数据的代码保持不变 ...

ValueFormatter formatter = new ValueFormatter() {
    @Override
    public String getAxisLabel(float value, AxisBase axis) {
        int index = Math.round(value - 0.5f);
        if (index >= 0 && index < xLabels.size()) {
            return xLabels.get(index);
        }
        return "";
    }
};

// ... 构建BarDataSet和BarData的代码保持不变 ...

XAxis xAxis = bc.getXAxis();
xAxis.setCenterAxisLabels(true);
xAxis.setPosition(XAxis.XAxisPosition.BOTH_SIDED);
xAxis.setAxisMinimum(0f);
xAxis.setGranularity(1);
// 修正轴最大值
xAxis.setAxisMaximum(barData.getXMax() + groupSpace);
// 启用自定义格式化器
xAxis.setValueFormatter(formatter);
bc.invalidate();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:15:33