java.lang.NegativeArraySizeException: -2 当从 MPAndroidChart Android 使用 LineChart 时

问题描述

我正在尝试使用 MpAndroidChart 库创建一个包含两个不同 LineDataSet 的 LineChart,但我仍然收到此错误,我不知道为什么:java.lang.NegativeArraySizeException: -2 我从后端获取我的数据,我正在使用 LiveData。我找到了关于这个主题的一些主题,那里提到的解决方案是按 X 值对 dataVals 进行排序。但就我而言,我的 X 值已经排序(从 0 到 2)。

我的观察者和 onViewCreated 方法

override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
    super.onViewCreated(view,savedInstanceState)
    theme = PreferenceManager.getDefaultSharedPreferences(context).getString("THEME","defaultStringIfnothingFound")!!;
    mClusterGuid = PreferenceManager.getDefaultSharedPreferences(context).getString("GUID","defaultStringIfnothingFound")!!;
    dataTypeSelected = PreferenceManager.getDefaultSharedPreferences(context).getString("DataType","defaultStringIfnothingFound")!!;
    role = PreferenceManager.getDefaultSharedPreferences(context).getString("Role","defaultStringIfnothingFound")!!
    lineChart = line_chart
    chartsviewmodel.getCashCollectionData(mClusterGuid)
    chartsviewmodel.getFinancialDetails(mClusterGuid)
    cashCollectionObserver()
    financialDetailsObserver()
    setLineChartData()
}

private fun cashCollectionObserver() {
    chartsviewmodel.cashCollection.observe(viewLifecycleOwner,androidx.lifecycle.Observer {
        if (it.isNotEmpty()) {
            setCashValues(it)
        }
    })
}

private fun financialDetailsObserver() {
    chartsviewmodel.financialDetails.observe(viewLifecycleOwner,androidx.lifecycle.Observer {
        if (it.isNotEmpty()) {
            setFinancialValues(it)
        }
    })
}

我的 setCashValues 和 setFinancialValues 方法

private fun setCashValues(cashList: MutableList<CashCollection.CashCollectionItem>) {
    val dataValsEntries: ArrayList<Entry> = ArrayList()
    val dateArrayList: ArrayList<String> = ArrayList()
    val reverseCashList: MutableList<CashCollection.CashCollectionItem> = ArrayList()
    val dataValsArray: ArrayList<Float> = ArrayList()
    var i = 1F
    var j = 1F
    if (cashList.isNullOrEmpty()) {
     
        Toast.makeText(context,"Cash Collection: No data available",Toast.LENGTH_SHORT).show()
    } else {
        
        val listIterator = cashList.listIterator()
        while ( listIterator.hasNext()) listIterator.next()
        while(listIterator.hasPrevIoUs()) reverseCashList.add(listIterator.prevIoUs())
        for (item in reverseCashList) {
            if (i <= 2) {
                val value: String = item.value!!.replaceFirst(",",".")
               // val date: String = item.label!!.replace(".2020","")
                if (value.toFloat() != 0F) {
                    dataValsEntries.add(Entry(i,value.toFloat()))
                    // dateArrayList.add(date)
                    i++
                }
            }
        }
        var lineDataSet1 = LineDataSet(dataValsEntries,"Cash Collection")
        lineDataSet1.setCircleColor(getChartsColors()[0])
        lineDataSet1.circleSize = 5f
        lineDataSet1.linewidth = 2f
        lineDataSet1.fillAlpha = 1
        lineDataSet1.setDrawFilled(true)
        lineDataSet1.fillColor = getChartsColors()[0]
        dataSets.add(lineDataSet1)
    }
}

private fun setFinancialValues(financialList: MutableList<FinancialDetails.FinancialDetailsItem>) {
    val dataValsEntries: ArrayList<Entry> = ArrayList()
    val dateArrayList: ArrayList<String> = ArrayList()
    val reverseFinancialList: MutableList<FinancialDetails.FinancialDetailsItem> = ArrayList()
    val dataValsArray: ArrayList<Float> = ArrayList()
    var i = 0F
    var j = 0F
    if (financialList.isNullOrEmpty()) {
       
        Toast.makeText(context,Toast.LENGTH_SHORT).show()
    } else {
       
        val listIterator = financialList.listIterator()
        while ( listIterator.hasNext()) listIterator.next()
        while(listIterator.hasPrevIoUs()) reverseFinancialList.add(listIterator.prevIoUs())
        for (item in reverseFinancialList) {
            if (i <= 2) {
                val value: String = item.value!!.replaceFirst(",".")
             //   val date: String = item.label!!.replace(".2020",value.toFloat()))
                    // dateArrayList.add(date)
                    i++
                }
            }
        }

        var lineDataSet2 = LineDataSet(dataValsEntries,"Financial Details")
        lineDataSet2.setCircleColor(getChartsColors()[1])
        lineDataSet2.circleSize = 5f
        lineDataSet2.linewidth = 2f
        lineDataSet2.fillAlpha = 1
        lineDataSet2.setDrawFilled(true)
        lineDataSet2.fillColor = getChartsColors()[1]
        dataSets.add(lineDataSet2)
    }
}

我的 setChartData 方法

private fun setLineChartData() {
    val barLabesArrayList: ArrayList<String> = ArrayList()
    val data = LineData(dataSets as List<ILineDataSet>?)
    data.setValueTextSize(10f)
    line_chart.data = data
    line_chart.description.isEnabled = false
    val xAxis = line_chart.xAxis
    val yAxisRight = line_chart.axisRight
    val yAxisLeft = line_chart.axisLeft
    yAxisRight.isEnabled = false
    yAxisLeft.isEnabled = true
    yAxisLeft.setDrawLabels(false)
    yAxisLeft.setDrawGridLines(true)
    xAxis.position = XAxis.XAxisPosition.BottOM
    xAxis.isEnabled = true
   /* line_chart.xAxis.valueFormatter = IndexAxisValueFormatter(barLabesArrayList)
    line_chart.xAxis.mAxisRange = barLabesArrayList.size.toFloat()*/
    //line_chart.xAxis.labelCount = 3
    line_chart.isClickable = false
    line_chart.isHighlightPerTapEnabled = false
    line_chart.onTouchListener = null
    line_chart.legend.isEnabled = true
    line_chart.animateY(2000)
    line_chart.invalidate()
}

任何建议都会有很大帮助!谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...