MPAndroidChart 添加 setData 编译报错

MPAndroidChart adding setData compiler error

我正在尝试使用 MPAndroidChart 创建折线图。我在网上看了很多例子,它们似乎都建议你像这样向图表中添加数据:

    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 上收到编译器错误:

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)

当我尝试创建条形图而不是折线图时,我遇到了同样的错误。

我也在为这个错误而苦恼。

我刚刚找到一个避免错误的方法。

列表不能存储超过 6 个的索引。 你试试 list store index 小于 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-beta1 的错误。

抱歉我的英语不好。 希望你能理解。

您正在将 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.0.0-beta1 开始,Entry 构造函数已更改为 Entry(float x, float y),因此您必须首先传递 x 索引,然后传递相应的 y 值。尽管这破坏了向后兼容性,但现在支持 float x 值感觉更自然。

因此您应该将代码更改为:

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 值排序,这可能是您的图表崩溃的原因(因为您在条目中切换了 x 值和 y 值)。上面的固定代码已经正确排序。

错误是因为您有未排序的值(未按 x 位置排序)。你可以修复做:

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

还有 check the documentation 有关该问题的更多信息。

尝试将依赖降级为:

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