PhilJay / MPAndroidChart

A powerful 🚀 Android chart view / graph view library, supporting line- bar- pie- radar- bubble- and candlestick charts as well as scaling, panning and animations.
Other
37.59k stars 9.02k forks source link

AddEntry for multiple sets : IndexOutOfBoundsException: Index: 0, Size: 0 #4015

Closed pwireless closed 6 years ago

pwireless commented 6 years ago

Library Release 3.0.3

Defining:

private static final int SET1 = 0; private static final int SET2 = 1; private static final int SET3 = 2; private static final int SET4 = 3;

and the following basic addEntry function :

private void addEntry(LineChart mChart, int set_index) {

    LineData data = mChart.getData();

    if (data != null) {

        ILineDataSet set = data.getDataSetByIndex(set_index);
        // set.addEntry(...); // can be called as well

        if (set == null) {
            set = createSet(set_index);
            data.addDataSet(set);
        }

        switch (set_index) {
            case SET1:
                data.addEntry(new Entry(set.getEntryCount(), ((float) (Math.random() * 40) + 80f)), set_index);
                break;
            case SET2:
                data.addEntry(new Entry(set.getEntryCount(), ((float) (Math.random() * 40) + 90f)), set_index);
                break;
            case SET3:
                data.addEntry(new Entry(set.getEntryCount(), ((float) (Math.random() * 40) + 100f)), set_index);
                break;
            case SET4:
                data.addEntry(new Entry(set.getEntryCount(), ((float) (Math.random() * 40) + 110f)), set_index);
                break;
        }
        data.notifyDataChanged();

        // let the chart know it's data has changed
        mChart.notifyDataSetChanged();

        // limit the number of visible entries
        //mChart.setVisibleXRangeMaximum(120);

        // move to the latest entry
        mChart.moveViewToX(data.getEntryCount());
    }
}

Now if I call :

addEntry(mChart, SET1); addEntry(mChart, SET2); addEntry(mChart, SET3);

note, in this case I add entry to 0, 1, 2 sets.

It works fine.

If I call :

addEntry(mChart, SET1); addEntry(mChart, SET3); addEntry(mChart, SET4);

note, in this case I add entry to 0, 2, 3 sets.

then I get this crash :

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.get(ArrayList.java:437) at com.github.mikephil.charting.data.DataSet.getEntryForIndex(DataSet.java:286) at com.github.mikephil.charting.utils.Transformer.generateTransformedValuesLine(Transformer.java:184) at com.github.mikephil.charting.renderer.LineChartRenderer.drawValues(LineChartRenderer.java:547) at com.github.mikephil.charting.charts.BarLineChartBase.onDraw(BarLineChartBase.java:264) at android.view.View.draw(View.java:20357) at android.view.View.updateDisplayListIfDirty(View.java:19302) at android.view.View.draw(View.java:20080) at android.view.ViewGroup.drawChild(ViewGroup.java:4421) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4207) at android.view.View.updateDisplayListIfDirty(View.java:19293) at android.view.View.draw(View.java:20080) at android.view.ViewGroup.drawChild(ViewGroup.java:4421) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4207) at android.view.View.draw(View.java:20360) at android.support.v4.view.ViewPager.draw(ViewPager.java:2418) at android.view.View.updateDisplayListIfDirty(View.java:19302) at android.view.View.draw(View.java:20080) at android.view.ViewGroup.drawChild(ViewGroup.java:4421) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4207) at android.view.View.updateDisplayListIfDirty(View.java:19293) at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4405) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4385) at android.view.View.updateDisplayListIfDirty(View.java:19261) at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4405) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4385) at android.view.View.updateDisplayListIfDirty(View.java:19261) at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4405) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4385) at android.view.View.updateDisplayListIfDirty(View.java:19261) at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4405) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4385) at android.view.View.updateDisplayListIfDirty(View.java:19261) at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:686) at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:692) at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:800) at android.view.ViewRootImpl.draw(ViewRootImpl.java:3447) at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3234) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2769) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1738) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7745) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911) at android.view.Choreographer.doCallbacks(Choreographer.java:723) at android.view.Choreographer.doFrame(Choreographer.java:658) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897) at android.os.Handler.handleCallback(Handler.java:789) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6940) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

almic commented 6 years ago

Since this is a duplicate of multiple other issues (all in that reference to the pull request) I'm going to close it.

pwireless commented 6 years ago

Glad that after my issue clarification, the long issue was solved... Thank you