Линейный график MPAndroidChart не любит мои реальные данные

Мои данные выглядят так:

{
    "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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эта ошибка может произойти, если данные не отсортированы по значению X.

Это описано в документации MPAndroidChart и в этой проблеме Github вместе с решением по сортировке данных.

Имейте в виду, что эта библиотека официально не поддерживает рисование данных LineChart из списка записей, не отсортированных по x-позиции записей в порядке возрастания. Добавление записей несортированным образом может привести к правильному рисованию, но также может привести к непредвиденному поведению.

Вы можете использовать EntryXComparator в MPAndroidChart, чтобы легко их сортировать.

val values = mutableListOf<Entry>()
// fill the values array
values.sortWith(EntryXComparator())

или просто используйте нативную сортировку Kotlin

values.sortBy { it.x }

Интересно, попробуем это

rminaj 15.05.2023 02:16

Небольшой вопрос, данные теперь работают, но они не отображаются сразу, мне нужно сначала нажать на график, чтобы они появились. Данные поступают с сервера, поэтому я устанавливаю данные только после их получения приложением. Что может быть причиной такого поведения?

rminaj 15.05.2023 02:33

Недостаточно информации, чтобы сказать, почему, может быть, данные загружаются асинхронно, но вы не вызываете chart.invalidate() после установки новых данных?

Tyler V 15.05.2023 02:48

Нет, я этого не делал. Я не думаю, что в примерах есть это. Только что проверил, chart.invalidate() был намного ниже тех частей, которые, как я думал, были только важными частями. chart.invalidate() это обязательное действие?

rminaj 15.05.2023 02:54

Не видя вашего кода, я могу только догадываться, но обычно вам нужно вызвать недействительность, если вы изменяете данные после того, как они были нарисованы. Если вы устанавливаете данные в обратном вызове после получения данных сервера, обычно это так.

Tyler V 15.05.2023 03:08

Другие вопросы по теме