Мои данные выглядят так:
{
"id": "6e10e9fc-2d1f-4c5c-a1c5-d94d99ec55db",
"air_temperature": 25.7,
"timestamp": "2023-05-12 15:00:00",
"parent_edge_device_id": "57028175-8f52-4bdd-b470-ff7485cdb80a"
}
air_temperature будет значением оси Y, а timestamp будет преобразовано в дату, время, а затем преобразовано в Float, чтобы быть осью X. Мой код выглядит так:
val formatter = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
for(item in items){
val date = formatter.parse(item.timestamp)!!
val dateTimestamp = date.time
val entry = Entry(
dateTimestamp.toFloat(),
item.air_temperature!!,
ResourcesCompat.getDrawable(resources, R.drawable.ic_star, null)
)
values.add(entry)
}
Я сделал Entry, который удовлетворяет требованиям класса, но библиотеке, похоже, это не нравится, и она не будет его отображать.
Я также думаю, что получаю ошибку, связанную с этим, которая выглядит так.
java.lang.NegativeArraySizeException: -16 в com.github.mikephil.charting.utils.Transformer.generateTransformedValuesLine(Transformer.java:178) в com.github.mikephil.charting.renderer.LineChartRenderer.drawValues(LineChartRenderer.java:549) в com.github.mikephil.charting.charts.BarLineChartBase.onDraw(BarLineChartBase.java:278) в android.view.View.draw(View.java:22644) в android.view.View.updateDisplayListIfDirty(View.java:21519) в android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4512)
Что довольно сбивает с толку, потому что я уверен, что что-то вставляется в значения List





Эта ошибка может произойти, если данные не отсортированы по значению X.
Это описано в документации MPAndroidChart и в этой проблеме Github вместе с решением по сортировке данных.
Имейте в виду, что эта библиотека официально не поддерживает рисование данных LineChart из списка записей, не отсортированных по x-позиции записей в порядке возрастания. Добавление записей несортированным образом может привести к правильному рисованию, но также может привести к непредвиденному поведению.
Вы можете использовать EntryXComparator в MPAndroidChart, чтобы легко их сортировать.
val values = mutableListOf<Entry>()
// fill the values array
values.sortWith(EntryXComparator())
или просто используйте нативную сортировку Kotlin
values.sortBy { it.x }
Небольшой вопрос, данные теперь работают, но они не отображаются сразу, мне нужно сначала нажать на график, чтобы они появились. Данные поступают с сервера, поэтому я устанавливаю данные только после их получения приложением. Что может быть причиной такого поведения?
Недостаточно информации, чтобы сказать, почему, может быть, данные загружаются асинхронно, но вы не вызываете chart.invalidate() после установки новых данных?
Нет, я этого не делал. Я не думаю, что в примерах есть это. Только что проверил, chart.invalidate() был намного ниже тех частей, которые, как я думал, были только важными частями. chart.invalidate() это обязательное действие?
Не видя вашего кода, я могу только догадываться, но обычно вам нужно вызвать недействительность, если вы изменяете данные после того, как они были нарисованы. Если вы устанавливаете данные в обратном вызове после получения данных сервера, обычно это так.
Интересно, попробуем это