【问题标题】:MPAndroidChart adding setData compiler errorMPAndroidChart 添加 setData 编译错误
【发布时间】:2016-11-26 13:22:00
【问题描述】:

我正在尝试使用 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) 不能 被应用于 (java.util.ArrayList, java.util.ArrayList)

我可以通过将代码更改为来修复编译器错误:

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

graph.setData(lineData);

然后我得到这个运行时错误:

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

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

【问题讨论】:

  • 试试:LineData lineData = new LineData(labels, dataSet);
  • @Guardanis LineData (com.github.mikephil.charting.interfaces.datasets.ILineDataSet...) LineData 不能应用于 (java.util.ArrayList, com .github.mikephil.charting.data.LineDataSet)
  • 奇怪,v2.2.5肯定有这个功能
  • @Guardanis 我正在使用“com.github.PhilJay:MPAndroidChart:v3.0.0-beta1”我将尝试使用 2.2.5。
  • 您是否尝试过按 x-index 对条目进行排序?另外,请注意,在 3.0.0 版本中,Entry 的第一个参数是 x 值,第二个参数是 y 值,因此您可能需要切换 Entry 初始化的顺序,所以它是例如new Entry(0, 4f);.

标签: java android mpandroidchart


【解决方案1】:

3.0.0-beta1 版本开始,Entry 构造函数已更改为Entry(float x, float y),因此您必须首先传递 x 索引,然后传递相应的 y 值。尽管这破坏了向后兼容性,但现在支持float x-values 感觉更自然。

所以你应该把你的代码改成这样:

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 值)。上面的固定代码已经正确排序了。

【讨论】:

    【解决方案2】:

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

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

    也可以check the documentation 了解有关该问题的更多信息。

    【讨论】:

      【解决方案3】:

      我也在为这个错误而苦苦挣扎。

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

      列表不能存储超过 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-beta1 的错误。

      对不起,我的英语很差。 希望你能理解。

      【讨论】:

        【解决方案4】:

        您将 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);
        

        【讨论】:

          【解决方案5】:

          尝试将依赖项降级为:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-01-31
            • 2015-01-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多