MPAndroidChart с нулевыми значениями

Я использую MPAndroidChart и мне это очень нравится.

«Небольшая» потребность, которая у меня есть, заключается в том, что я могу поместить нулевые значения в «записи». Я отслеживаю соединения apache на серверах моей системы, и я хотел бы видеть, не работают ли они (где я помещаю нулевое значение) или просто нет соединений (0).

Я пытался, но класс Entry не принимает «null» в качестве значения, показывающего сообщение: «Конструктор Entry (null, int) не определен»

Спасибо!


person Zero    schedule 15.08.2014    source источник
comment
Связано: stackoverflow.com/q/40448081   -  person David Rawson    schedule 08.05.2017


Ответы (2)


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

Пример:

// array that contains the information you want to display
ConnectionHolder[] connectionHolders = ...;

ArrayList<Entry> entries = new ArrayList<Entry>();
int cnt = 0;

for(ConnectionHolder ch : connectionHolders) {

    if(ch != null) entries.add(new Entry(ch.getNrOfConnections(), cnt));
    else {
        // do nothing
    }

    cnt++; // always increment
}

Это создаст, например. LineChart, где круги не рисуются на индексах, где объект ConnectionHolder был нулевым.

В будущем выпуске библиотеки я постараюсь добавить эту функцию, чтобы поддерживались нулевые значения.

person Philipp Jahoda    schedule 15.08.2014
comment
Спасибо за ваш ответ, но это не работает... он просто проводит "большую линию" между двумя точками... Мне нужно, чтобы эта нулевая точка показывала пустое пространство. Итак, пока вы поддерживаете это, я попробую сделать круг другого цвета.. это возможно, хорошо? Хотели бы вы, чтобы я опубликовал как проблему в github? - person Zero; 22.08.2014
comment
Точно, не работает. Я отправляю правильный xIndex и соответствующее значение, и он рисует линию между xIndex - person rafaelasguerra; 25.08.2015

Мое решение состоит в том, чтобы нарисовать другой набор данных с ПРОЗРАЧНЫМ (или произвольным) цветом: - диаграмма с фиксированным количеством значений X - значения Y периодически обновляются - логический флаг указывает на прозрачную часть (или другой цвет)

private static final int SERIES_SIZE = 360; 
int xIndex = -1;
float xIndexVal;
private LineChart chart;
private boolean currentFlag;

public void createChart(LineDataSet dataSet) {
    LineData chartData = new LineData();
    prepareDataSet(dataSet);
    chartData.addDataSet(dataSet);
    for (int i = 0; i < SERIES_SIZE; i++) {
        chartData.addXValue("" /*+ i*/);
    }
    chart.setData(chartData);

}

private void prepareDataSet(LineDataSet dataSet, YAxis axis, int color) {
    // configure set 
}


public void update(Float val, boolean flag) {
    List<ILineDataSet> dsl = chart.getData().getDataSets();
    Log.d("chart", String.format("%s --- %d sets, index %d", descr,  dsl.size(), xIndex));

    if (xIndex == SERIES_SIZE - 1) {

        // remove all entries at X index 0
        for (int i = 0; i < chart.getData().getDataSetCount(); i++) {
            Entry entry0 = chart.getData().getDataSetByIndex(i).getEntryForIndex(0);
            if (entry0 != null && entry0.getXIndex() == 0) {
                chart.getData().removeEntry(entry0, i);
                Log.d("chart", String.format("entry 0 removed from dataset %d, %d entries in the set", i, chart.getData().getDataSetByIndex(i).getEntryCount()));
            }
            else {
                Log.d("chart", String.format("all %d entries in the set kept", chart.getData().getDataSetByIndex(i).getEntryCount()));
            }
        }

        // remove empty set, if any
        for (Iterator<ILineDataSet> mit = dsl.iterator(); mit.hasNext(); ) {
            if (mit.next().getEntryCount() == 0) {
                mit.remove();
                Log.d("chart", String.format("set removed, %d sets", dsl.size()));
            }
        }

        // move all entries by -1
        for (ILineDataSet ds : dsl) {
            for (Entry entry : ((LineDataSet)ds).getYVals()) {
                entry.setXIndex(entry.getXIndex() - 1);
            }
        }
    }
    else {
        xIndex++;
    }

    if (currentFlag != flag) {
        currentFlag = !currentFlag;
        LineDataSet set = new LineDataSet(null, "");
        prepareDataSet(set, chart.getAxisLeft(), currentFlag ?  Color.TRANSPARENT : Color.BLUE);
        chart.getData().addDataSet(set);

        if (xIndex != 0) {
            chart.getData().addEntry(new Entry(xIndexVal, xIndex - 1), dsl.size() - 1);
        }
    }

    xIndexVal = val;

    chart.getData().addEntry(new Entry(val, xIndex), dsl.size() - 1);

    chart.notifyDataSetChanged();
    chart.invalidate();
}
person Roman Jokl    schedule 23.02.2016