MPAndroidChart как изменить данные (увеличенный объем данных) - приводит к NPE - PullRequest
0 голосов
/ 15 марта 2019

на моем графике я периодически обновляю данные на графике.Это работает нормально и, как и ожидалось.Проблема возникает, когда новый набор данных, который я использую, больше предыдущего.Затем я получаю исключение NullPointerException.

java.lang.NullPointerException: попытка вызвать виртуальный метод long java.lang.Long.longValue () для ссылки на пустой объект

Вот как я это делаю:

LineData lineData = chart.getLineData();

if(lineData != null) {
   ILineDataSet dataSet = lineData.getDataSetByLabel(label, false);
                lineData.removeDataSet(dataSet);
}
int lineColor = colorDataLine;
int textColor = textColorDataLine;

Collections.sort(entries, new EntryXComparator());
LineDataSet dataSet = new LineDataSet(entries, label);
dataSet.setColor(lineColor);
dataSet.setValueTextColor(textColor);

lineData = new LineData(dataSet);
lineData.setDrawValues(false);
chart.setData(lineData);

Вкл chart.setData(lineData); Исключение происходит:

Я проверил DynamicalAddingActivity.java из MPChartExample https://github.com/PhilJay/MPAndroidChart/archive/master.zip

Тамданные добавляются с помощью итераций с использованием addEntry.

LineData data = chart.getData();
data.addEntry(new Entry(randomSet.getEntryCount(), value), randomDataSetIndex);
data.notifyDataChanged();

При изменении моего первого подхода к следующему ошибка все еще возникает.

lineData.addDataSet(dataSet);
lineData.setDrawValues(false);
chart.notifyDataSetChanged();

При изменении подхода к итеративному способукак это:

LineData lineData = chart.getLineData();
if(lineData == null) {
    lineData = new LineData();
    chart.setData(lineData);
}
lineData.setDrawValues(false);

LineDataSet dataSet = (LineDataSet) lineData.getDataSetByLabel(label, false);
if(dataSet == null){
    dataSet = new LineDataSet(entries, label);
    lineData.addDataSet(dataSet);
}
while(dataSet.getEntryCount() > 0) {
    dataSet.removeLast();
}
for (int i = 0; i < entries.size(); i++) {
    lineData.addEntry(entries.get(i), 0); //edit2: set datasetIndex from i to 0 hardcoded
    lineData.notifyDataChanged();
}

edit2:

Тогда addEntry не имеет никакого эффекта для увеличенного объема данных -> На первой итерации entry.size () был равен 1. -> Во второй итерации entry.size () было 10. -> тем не менее, даже после того, как в этой итерации десять раз выполнили addEntry, в наборе данных хранится только первая добавленная запись.Общий entryCount набора данных остается равным 1.

Он работает, но все равно выглядит не очень эффективно из-за обеих итераций (удалите все старые, добавьте все новые).

Итак, что яЯ делаю не так?

Так может быть, есть лучший путь или это единственный путь?

Мне также интересно, какая разница будет между

dataset.addEntry();

и

linedata.addEntry();

Спасибо.

edit1:

, когда при инициализации в наборе данных с нулем вместо списка записей моя диаграмма вылетает из-за отсутствия данных, предельных линий и цвета.области нарисованы.

Они нарисованы, но через минуту или около того.Очень высокая задержка при использовании null для инициализации.

edit2: см. Зачеркивание выше.

...