MPAndroidChart аварийно завершает работу с IndexOutOfBoundsException - PullRequest
0 голосов
/ 11 июля 2019

У меня есть приложение, которое сохраняет значения с датой в базе данных. Есть разные категории. Например, я могу сохранить значения (значение: 23, дата: 15.10.2019, категория: автомобиль). Я хочу отобразить сумму значений за месяц и категорию в Barchart, используя MPAndroidChart. Так, например, я могу выбрать категорию «Автомобиль», а на графике отображается сумма значений в июне, июле, августе и т. Д.

Вот код для обновления графика:

private fun createNewGraph() {
    val initializer = DatabaseInitializer.getInstance()
    val db = AppDatabase.getInstance(context)

    val minDate = if(cbAllCats.isChecked) {
        initializer.getMinDate(db.entryDao())
    } else {
        initializer.getMinDateByCatId(db.entryDao(), curCatId!!)
    }
    val maxDate = if(cbAllCats.isChecked) {
        initializer.getMaxDate(db.entryDao())
    } else {
        initializer.getMaxDateByCatId(db.entryDao(), curCatId!!)
    }

    val c = Calendar.getInstance()
    c.time = minDate
    val minMonth = c.get(Calendar.MONTH) + 1
    val minYear = c.get(Calendar.YEAR)

    c.time = maxDate
    val maxMonth = c.get(Calendar.MONTH) + 1
    val maxYear = c.get(Calendar.YEAR)
    //Until here, it is just getting the month and year of the first and last entry

    val barEntries = ArrayList<BarEntry>()
    val stackLabels = ArrayList<String>()

    var count = 0f
    for (i in minYear..maxYear) {
        for (j in 1..12) {
            if (i == minYear && j < minMonth)
                continue
            if (i == maxYear && j > maxMonth)
                continue
            val sum = if(cbAllCats.isChecked) {
                initializer.getSumByDate(db.entryDao(), j, i)
            } else {
                initializer.getSumByCatIdAndDate(db.entryDao(), curCatId!!, j, i)
            }

            val barEntry = BarEntry(count, sum)
            barEntries.add(barEntry)
            stackLabels.add(getStringFromMonth(j) + " $i")
            count++
        }
    }

    val barDataSet = BarDataSet(barEntries, getString(R.string.months))
    val barData = BarData(barDataSet)
    barChartMonths.apply {
        data = barData
        xAxis.apply {
            valueFormatter = ChartXAxisFormatter(stackLabels)
            axisMinimum = -barData.barWidth / 1.5f
            axisMaximum = barEntries.size.toFloat() + barData.barWidth / 1.5f - 1f
            position = XAxis.XAxisPosition.BOTTOM
            granularity = 1f
            labelRotationAngle = 90f
        }
        notifyDataSetChanged()
        invalidate()
    }
}

Вот код для XAxisFormatter:

private inner class ChartXAxisFormatter(private val values: ArrayList<String>): IndexAxisValueFormatter() {
    override fun getFormattedValue(value: Float): String {
        return values[value.toInt()]  //App crashes at this line
    }
}

Этот код работает с одним исключением. Когда я выбираю категорию, например, с 8 месяцами (то есть 8 столбцов), а затем выбираю категорию с менее чем 8 месяцами, приложение вылетает со следующим журналом:

2019-07-11 14:49:30.254 9683-9683/com.financetracker.financetracker E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.financetracker.financetracker, PID: 9683
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1

Я попытался очистить barChart поверх метода, но это не имеет значения.

...