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

MPAndroidChart日期格式化异常:Coingecko数据图表日期显示错误求助

问题解决:MPAndroidChart日期始终显示Jan 1, 1970的修复方案

核心问题分析

你遇到两个关键错误:

  1. 格式化器设置位置错误:你把日期格式化器设置给了LineDataSet.setValueFormatter(),这个方法是用来格式化数据点上的数值标签(比如Y轴价格),而非X轴的日期标签。X轴的格式化需要单独设置给XAxis.setValueFormatter()。
  2. 循环逻辑错误:填充图表数据的for循环中,变量i没有自增(缺少i++),会导致无限循环,最终只会重复添加第一个符合条件的Entry,引发数据异常。

修复步骤及代码修改

1. 修正填充数据的循环逻辑

给循环变量添加自增操作,确保遍历所有数据:

List<Entry> lineList = new ArrayList<>();
for (int i = 0; i < chartDataList.size(); i++) { // 添加i++
    if (i % 10 == 0) {
        ChartData chartData = chartDataList.get(i);
        lineList.add(new Entry(chartData.getTimeStamp(), (float) chartData.getCost()));
    }
}
drawLineChart(lineList);

2. 调整日期格式化器实现

自定义X轴专用格式化器,直接继承ValueFormatter(IndexAxisValueFormatter适用于基于索引的X轴,不适合时间戳场景):

public class XAxisDateFormatter extends ValueFormatter {
    private final DateFormat dateFormat;

    public XAxisDateFormatter() {
        dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault());
    }

    @Override
    public String getFormattedValue(float value) {
        long timestamp = (long) value;
        return dateFormat.format(new Date(timestamp));
    }
}

3. 修改折线图绘制方法,正确配置X轴格式化器

移除错误的LineDataSet格式化器设置,转而给X轴绑定日期格式化器:

private void drawLineChart(List<Entry> lineList) {
    Description description = new Description();
    description.setText("trying");
    lineChart.setDescription(description);

    LineDataSet lineDataSet = new LineDataSet(lineList, "Test");
    // 移除错误的格式化器设置:lineDataSet.setValueFormatter(new LineChartXAxisFormatter());
    lineDataSet.setFillAlpha(110);
    lineDataSet.setColors(ColorTemplate.COLORFUL_COLORS);
    lineDataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);
    lineDataSet.setDrawFilled(true);
    lineDataSet.setFillColor(Color.GREEN);

    LineData lineData = new LineData(lineDataSet);
    lineChart.setData(lineData);
    lineData.setValueTextSize(20f);
    lineData.setValueTextColor(Color.BLACK);

    // 关键:给X轴设置日期格式化器
    XAxis xAxis = lineChart.getXAxis();
    xAxis.setValueFormatter(new XAxisDateFormatter());
    // 可选:调整标签角度避免重叠
    xAxis.setLabelRotationAngle(45f);

    lineChart.invalidate();
}

额外验证点

  • 确认ChartData的timeStamp字段正确解析了Coingecko返回的13位毫秒级时间戳(无需除以1000)。
  • 你单独测试格式化器的结果正常,说明时间戳本身无问题,问题完全出在MPAndroidChart的配置和循环逻辑上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:46:05