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
相关产品推荐
相关产品推荐

