У меня есть приложение, которое сохраняет значения с датой в базе данных. Есть разные категории. Например, я могу сохранить значения (значение: 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 поверх метода, но это не имеет значения.