MPAndroidChart日期格式化异常:Coingecko数据图表日期显示错误求助
问题解决:MPAndroidChart日期始终显示Jan 1, 1970的修复方案
核心问题分析
你遇到两个关键错误:
- 格式化器设置位置错误:你把日期格式化器设置给了
LineDataSet.setValueFormatter(),这个方法是用来格式化数据点上的数值标签(比如Y轴价格),而非X轴的日期标签。X轴的格式化需要单独设置给XAxis.setValueFormatter()。 - 循环逻辑错误:填充图表数据的
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
相关产品推荐
相关产品推荐

