2016-07-22 1 views
1

Я пытаюсь создать линейный граф с использованием MPAndroidChart. Я посмотрел на много примеров в Интернете, и все они, кажется, предполагают, что вы добавляете данные на график, как это:MPAndroidChart добавление ошибки компилятора setData

LineChart graph = (LineChart) view.findViewById(R.id.chart); 

    // creating list of entry 
    ArrayList<Entry> entries = new ArrayList<>(); 
    entries.add(new Entry(4f, 0)); 
    entries.add(new Entry(8f, 1)); 
    entries.add(new Entry(6f, 2)); 
    entries.add(new Entry(2f, 3)); 
    entries.add(new Entry(18f, 4)); 
    entries.add(new Entry(9f, 5)); 

    // creating labels 
    ArrayList<String> labels = new ArrayList<String>(); 
    labels.add("January"); 
    labels.add("February"); 
    labels.add("March"); 
    labels.add("April"); 
    labels.add("May"); 
    labels.add("June"); 

    graph.setData(entries, labels); 

Но я получаю ошибку компиляции на УстановитьДанном говоря:

setData (com.github.mikephil.charting.data.LineData) in Chart cannot be applied to (java.util.ArrayList, java.util.ArrayList)

я могу исправить ошибка компилятора, изменив мой код:

LineDataSet dataSet = new LineDataSet(entries, "# of Calls"); 
LineData lineData = new LineData(dataSet); 

graph.setData(lineData); 

Но я получаю эту ошибку во время выполнения:

FATAL EXCEPTION: main Process: com.ebucher.lisa, PID: 11365 java.lang.NegativeArraySizeException: -2 at com.github.mikephil.charting.utils.Transformer.generateTransformedValuesLine(Transformer.java:181) at com.github.mikephil.charting.renderer.LineChartRenderer.drawValues(LineChartRenderer.java:570) at com.github.mikephil.charting.charts.BarLineChartBase.onDraw(BarLineChartBase.java:272) at android.view.View.draw(View.java:17469) at android.view.View.updateDisplayListIfDirty(View.java:16464) at android.view.View.draw(View.java:17238) at android.view.ViewGroup.drawChild(ViewGroup.java:3921) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3711) at android.view.View.draw(View.java:17472) at android.view.View.updateDisplayListIfDirty(View.java:16464) at android.view.View.draw(View.java:17238) at android.view.ViewGroup.drawChild(ViewGroup.java:3921) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3711) at android.view.View.updateDisplayListIfDirty(View.java:16459) at android.view.View.draw(View.java:17238) at android.view.ViewGroup.drawChild(ViewGroup.java:3921) at android.support.v4.widget.DrawerLayout.drawChild(DrawerLayout.java:1373) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3711) at android.view.View.updateDisplayListIfDirty(View.java:16459) at android.view.View.draw(View.java:17238) at android.view.ViewGroup.drawChild(ViewGroup.java:3921) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3711) at android.view.View.updateDisplayListIfDirty(View.java:16459) at android.view.View.draw(View.java:17238) at android.view.ViewGroup.drawChild(ViewGroup.java:3921) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3711) at android.view.View.updateDisplayListIfDirty(View.java:16459) at android.view.View.draw(View.java:17238) at android.view.ViewGroup.drawChild(ViewGroup.java:3921) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3711) at android.view.View.updateDisplayListIfDirty(View.java:16459) at android.view.View.draw(View.java:17238) at android.view.ViewGroup.drawChild(ViewGroup.java:3921) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3711) at android.view.View.updateDisplayListIfDirty(View.java:16459) at android.view.View.draw(View.java:17238) at android.view.ViewGroup.drawChild(ViewGroup.java:3921) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3711) at android.view.View.draw(View.java:17472) at com.android.internal.policy.PhoneWindow$DecorView.draw(PhoneWindow.java:3205) at android.view.View.updateDisplayListIfDirty(View.java:16464) at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:325) at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:331) at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:366) at android.view.ViewRootImpl.draw(ViewRootImpl.java:3134) at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2933) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2522) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1437) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7397) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920) at android.view.Choreographer.doCallbacks(Choreographer.java:695) at android.view.Choreographer.doFrame(Choreographer.java:631) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:158) at android.app.ActivityThread.main(ActivityThread.java:7229) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

Я получаю те же ошибки, когда пытаюсь создать гистограмму вместо линейного графика.

+0

Try: LineData lineData = новый LineData (этикетки, DataSet); – Guardanis

+0

@Guardanis LineData (com.github.mikephil.charting.interfaces.datasets.ILineDataSet ...) в LineData не может быть применен к (java.util.ArrayList , com.github .mikephil.charting.data.LineDataSet) – java

+1

Странно, это определенно доступно в v2.2.5 – Guardanis

ответ

0

Try понижая зависимость к:

compile 'com.github.PhilJay:MPAndroidChart:v2.0.9' 
0

Я тоже борюсь с этой ошибкой.

Я только что нашел способ избежать ошибки.

Список не может хранить индекс больше 6. Вы пытаетесь индексный список магазина меньше 5.

Пример:

ArrayList<Entry> entries = new ArrayList<>(); 
entries.add(new Entry(4f, 0)); 
entries.add(new Entry(8f, 1)); 
entries.add(new Entry(6f, 2)); 
entries.add(new Entry(2f, 3)); 
entries.add(new Entry(18f, 4)); 

// creating labels 
ArrayList<String> labels = new ArrayList<String>(); 
labels.add("January"); 
labels.add("February"); 
labels.add("March"); 
labels.add("April"); 
labels.add("May"); 

Но применение иногда закончить и получить NegativeArraySizeException: -2.

При попытке список магазина индекс меньше 4.

Я думаю, что эта ошибка ошибка v3.0.0-бета1 в.

Извините за мой плохой английский. Надеюсь, вы поймете.

0

Вы добавляете объект LinedataSet к SETDATE вместо Список LinedataSet объектов

См ниже код

LineDataSet dataSet = new LineDataSet(entries, "# of Calls"); 
ArrayList<ILineDataSet> dataSetList = new ArrayList<ILineDataSet>(); 
      dataSets.add(dataSet); // add the datasets 
LineData lineData = new LineData(dataSetList); 

graph.setData(lineData); 
3

Начиная с версии 3.0.0-beta1 в Entry конструкторы изменили к Entry(float x, float y), так что вы будете первым проходом x-index, а затем соответствующее y-значение. Несмотря на то, что это нарушает обратную совместимость, теперь кажется более естественным, что поддерживаются 0-значные значения float.

Таким образом, вы должны изменить свой код на этот:

LineChart graph = (LineChart) view.findViewById(R.id.chart); 

// creating list of entry 
ArrayList<Entry> entries = new ArrayList<>(); 
entries.add(new Entry(0, 4f)); 
entries.add(new Entry(1, 8f)); 
entries.add(new Entry(2, 6f)); 
entries.add(new Entry(3, 2f)); 
entries.add(new Entry(4, 18f)); 
entries.add(new Entry(5, 9f)); 

LineDataSet dataSet = new LineDataSet(entries, "# of Calls"); 
LineData lineData = new LineData(dataSet); 

graph.setData(lineData); 

Кроме того, для того, чтобы сделать рендеринг оптимизации записи должны быть отсортированы по х-значение, которое может быть, почему ваш график разбивающихся (так как вы в ваших записях были введены x- и y-значения). Исправленный код уже правильно отсортирован.

1

Ошибка вызвана тем, что у вас есть unsorted values ​​ (не отсортировано по x-позиции). Вы можете исправить:

List<Entry> entries = ...; 
Collections.sort(entries, new EntryXComparator()); 

Также check the documentation для получения дополнительной информации по этому вопросу.