原先是依次遍历数据,找出数据集中的最大值赋值,然后设置y轴的最高点。但是如果所有数据都为0时,y轴最大值为0,点击中间的坐标点展示MarkerView都只会在最后一个点展示MarkerView。

private fun setStoreLineData(chartView: LineChart, storeDatas: List<StoreTrendModel>) {
val chartEntrys = ArrayList<Entry>()
var maxXValue = (storeDatas!!.size - 1).toFloat() //记录最大的x数值
var maxYValue = 0f //记录最大的y数值
xDatasList.clear()
for (i in 0 until storeDatas!!.size) {
xDatasList.add(storeDatas!![i].timestamp.toLong()) // 将日期存到一个时间戳列表里
// 计算最大值
if (maxYValue <= storeDatas!![i].storeCount) {
maxYValue = storeDatas!![i].storeCount.toFloat()
}
// 设置趋势图数据
chartEntrys.add(Entry(i.toFloat(),storeDatas!![i].storeCount.toFloat()))
}
chartView.xAxis.axisMinimum = 0f
chartView.xAxis.axisMaximum = maxXValue
chartView.axisLeft.axisMinimum = 0f
// chartView.axisLeft.axisMaximun = maxYValue // 这么写,如果y轴最大值为0时,markerView不能正常显示!!
if (maxYValue != 0f) {
binding.lcPerformance.axisLeft.axisMaximum = maxYValue // 这样写就对了
}
// create marker to display box when values are selected
val xValueFormatter = DateAxisValueFormatter(xDatasList,true)
mv = PerformanceHintMarkerView(context,xValueFormatter,binding.lcPerformance,storeLineName, true)
// Set the marker to the lineChart
mv!!.chartView = binding.lcPerformance
chartView.marker = mv
chartView.setDrawMarkers(false)
binding.lcPerformance.notifyDataSetChanged()
binding.lcPerformance.invalidate()
binding.lcPerformance.animateX(1000)
}
修改后MarkerView可以正常显示

文章描述了一个在Android应用中处理LineChart的问题,当数据全为0时,y轴最大值设为0导致MarkerView无法正常显示。作者通过调整代码,确保在y轴最大值不为0时正确设置轴的最大限制,从而解决了问题,现在MarkerView能正常在选择的点上显示。

1268

被折叠的 条评论
为什么被折叠?



