Kotlin中使用MPAndroidChart读取CSV数据更新折线图的方法求助
实现方案
原生实现方案(无第三方依赖,适合初学者)
1. 读取选中CSV文件的文本内容
在文件选择器的回调逻辑中,拿到返回的Uri后调用以下方法读取文件内容:
private fun readCsvFromUri(uri: Uri): List<String>? { return try { contentResolver.openInputStream(uri)?.use { inputStream -> inputStream.bufferedReader().readLines() } } catch (e: Exception) { e.printStackTrace() // 可自定义Toast提示用户文件读取失败 null } }
2. 解析分号分隔的数值数据
把读取到的文件行内容,解析为可用于折线图的数值列表:
private fun parseCsvData(lines: List<String>): List<Float> { val numberList = mutableListOf<Float>() lines.forEach { line -> // 跳过空行,按分号切割后去除每个元素的首尾空格 val items = line.trim().split(";").map { it.trim() } items.forEach { item -> if (item.isNotEmpty()) { try { val number = item.toFloat() numberList.add(number) } catch (e: NumberFormatException) { // 非数值格式内容直接跳过,也可根据需求添加异常提示 } } } } return numberList }
3. 更新MPAndroidChart折线图
将解析到的数值替换原有硬编码数据,刷新折线图:
private fun updateLineChart(dataList: List<Float>) { val entries = mutableListOf<Entry>() // index为X轴坐标,value为Y轴数值,可根据自己的X轴逻辑调整 dataList.forEachIndexed { index, value -> entries.add(Entry(index.toFloat(), value)) } val dataSet = LineDataSet(entries, "CSV导入数据") // 保留你之前硬编码时的折线样式配置,比如颜色、线宽、圆点样式等 dataSet.color = Color.BLUE dataSet.setCircleColor(Color.RED) dataSet.lineWidth = 2f dataSet.circleRadius = 3f val lineData = LineData(dataSet) lineChart.data = lineData // 必须调用这两个方法才会刷新图表视图 lineChart.notifyDataSetChanged() lineChart.invalidate() }
可选第三方库(复杂CSV场景使用)
如果后续CSV有表头、特殊字符包裹、多列复杂结构,可以使用opencsv库简化解析,引入方式:
在Module级别的build.gradle文件的dependencies块中添加:
implementation 'com.opencsv:opencsv:5.6'
指定分号为分隔符的解析示例:
private fun parseCsvWithOpenCsv(uri: Uri): List<Float> { val numberList = mutableListOf<Float>() try { contentResolver.openInputStream(uri)?.use { inputStream -> val reader = inputStream.bufferedReader() val csvReader = CSVReaderBuilder(reader) .withSeparator(';') // 指定分隔符为分号 .build() var nextLine: Array<String>? while (csvReader.readNext().also { nextLine = it } != null) { nextLine?.forEach { item -> try { numberList.add(item.trim().toFloat()) } catch (e: NumberFormatException) { // 跳过无效数值 } } } csvReader.close() } } catch (e: Exception) { e.printStackTrace() } return numberList }
注意事项
- 全程添加异常捕获,避免文件损坏、格式错误导致应用崩溃,可配合Toast给用户友好提示
- 安卓高版本使用系统文件选择器返回的Uri不需要申请额外存储权限,直接通过contentResolver读取即可
- 如果原有折线图有多组数据,对应调整解析逻辑和数据集创建逻辑即可
内容的提问来源于stack exchange,提问作者MaksChojniak
相关产品推荐
相关产品推荐

