问题重现:
可以看见 MPAndroidChart 直接罢工了
代码如下:
val data1 = ArrayList<GetData1>()
...
private fun getNewsData(id: Int) { NetWorkCreator.getData1(id.toString()).enqueue(object :Callback<GetData1>{ override fun onResponse(call: Call<GetData1>, response: Response<GetData1>) { val body = response.body() if (body!= null){ data1.add(body) setBarChart() } } override fun onFailure(call: Call<GetData1>, t: Throwable) { Log.d("DataFragment",t.stackTraceToString()) } }) } private fun setBarChart() { //设置无数据提示 binding.BarChart.setNoDataTextColor(Color.parseColor("#003B4C")) binding.BarChart.setNoDataText("暂无数据~") //添加数据 val entries = ArrayList<BarEntry>() for (x in 0 until data1.size){ entries.add(BarEntry(x.toFloat(),data1[x].total.toFloat())) } val xAxis = binding.BarChart.xAxis xAxis.position = XAxis.XAxisPosition.BOTTOM; xAxis.valueFormatter = IndexAxisValueFormatter(listOf("50","51","52","53")) xAxis.setDrawGridLines(false) xAxis.granularity = 1f //数据添加到数据集 val dataSet = BarDataSet(entries,"") //柱体颜色 dataSet.color = Color.parseColor("#FF6363") //数据集赋值给数据对象 val data = BarData(dataSet) data.barWidth = 0.2f; binding.BarChart.axisRight.isEnabled = false binding.BarChart.data = data val description = binding.BarChart.description description.text = "评论人数" binding.BarChart.description = description }
可以看见原本想的是每次获取数据后都绘制一次就可以了,但这样它一次都不画
解决过程:
思考了两种方案
1.使用线程等待,将异步线程在得到数据后等待,在所有线程都得到数据后一起绘制
2.现在主页面中获取对应数据后发给它(本文的柱状图是绘制在fragment中的)
实际执行下来两种方案都不行,于是掏出九阳神功 -- 查文章 和 翻源码
解决方案:
最后瞥见一个clear方法,想是否是因为每次绘制完没清空,这个框架不会自动覆盖以前的。
那么解决方案就是在图绘制之前添加一个clear方法
binding.BarChart.clear()// 清空 //设置无数据提示 binding.BarChart.setNoDataTextColor(Color.parseColor("#003B4C")) binding.BarChart.setNoDataText("暂无数据~")
最终效果: