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

Android中MPAndroidChart将日期字符串转整数绘制折线图

解决MPAndroidChart日期字符串转数值适配折线图的问题

核心思路

MPAndroidChart的Entry要求X轴为数值类型,我们可以把日期字符串转换为**时间戳(毫秒数)**作为X轴的数值,再通过自定义ValueFormatter让X轴显示回日期格式,同时修正数据库查询的分组问题(否则无法按日期统计数据)。

步骤1:修正数据库查询语句

你的查询没有按日期分组,会导致只返回一条总计数数据,需要添加GROUP BY:

public List<lineGraphClass> dataDebatebyGroupDate(int id){
    SQLiteDatabase db = this.getReadableDatabase();
    // 添加GROUP BY按日期分组,才能统计每日的数据量
    String query = "SELECT count(arguments.id_arguments),arguments.date_arguments FROM arguments WHERE arguments.arguments_summary_debate_relation =? GROUP BY arguments.date_arguments";
    Cursor cursor = db.rawQuery(query, new String[]{String.valueOf(id)});
    List<lineGraphClass> data = new ArrayList<>();
    if (cursor.moveToFirst()) {
        do {
            lineGraphClass fill_data = new lineGraphClass();
            fill_data.setCount(cursor.getInt(0));
            fill_data.setDate(cursor.getString(1));
            data.add(fill_data);
        } while (cursor.moveToNext());
    }
    db.close();
    return data;
}

步骤2:日期字符串转时间戳(适配Entry的数值要求)

在fillDataset方法中,把日期字符串转换为时间戳(毫秒数,转成float作为Entry的X值):

private ArrayList<Entry> fillDataset() {
    ConexionSQliteHelper conn = new ConexionSQliteHelper(getContext(), "lala", null, 40);
    name = getArguments().getString("name");
    title = getArguments().getString("title");
    int id = conn.requestId(name);
    int id_text_discuss = conn.requestIdDiscuss(id, title);
    data = conn.dataDebatebyGroupDate(id_text_discuss);
    
    ArrayList<Entry> datavalues = new ArrayList<>();
    // 定义日期格式,要和数据库中date_arguments的格式一致,比如"yyyy-MM-dd HH:mm:ss"
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
    
    for (int i = 0; i < data.size(); i++) {
        try {
            // 把日期字符串转成Date,再获取时间戳(毫秒),转成float作为X轴数值
            Date date = sdf.parse(data.get(i).getDate());
            long timestamp = date.getTime();
            datavalues.add(new Entry((float) timestamp, data.get(i).getCount()));
        } catch (ParseException e) {
            e.printStackTrace();
            // 解析失败时可以跳过该数据或设置默认值
        }
    }
    return datavalues;
}

步骤3:自定义X轴格式化器,显示日期字符串

在onCreateView中设置X轴的格式化器,让X轴显示回日期,而不是时间戳:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_line_chart, container, false);
    LineChart linechart = view.findViewById(R.id.linechart);
    LineDataSet linedataset = new LineDataSet(fillDataset(),"");
    ArrayList<ILineDataSet> dataSets = new ArrayList<>();
    dataSets.add(linedataset);
    LineData linedata = new LineData(dataSets);
    linechart.setData(linedata);
    
    // 自定义X轴格式化
    XAxis xAxis = linechart.getXAxis();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
    xAxis.setValueFormatter(new ValueFormatter() {
        @Override
        public String getFormattedValue(float value) {
            // 把时间戳转回日期字符串
            long timestamp = (long) value;
            return sdf.format(new Date(timestamp));
        }
    });
    // 可选:设置X轴标签倾斜,避免重叠
    xAxis.setLabelRotationAngle(45);
    
    linechart.invalidate();
    return view;
}

注意事项

  • 确保SimpleDateFormat的格式和数据库中date_arguments字段的格式完全一致,否则会解析失败。
  • 如果使用Java 8+,可以用DateTimeFormatter替代SimpleDateFormat,线程更安全:
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    LocalDateTime localDateTime = LocalDateTime.parse(dateStr, formatter);
    long timestamp = localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:55:37