饼图图例仅显示 MP Android 图表中绘制的 12 个类别中的一个

PieChart legend displaying only 1 of the 12 categories plotted in MP Android Chart

我以前用过MPandroidchart的饼图,图例是自动生成的。对于我正在开发的新应用程序,使用相同的代码生成的图表在图例中只有一个条目,而不是 12 个条目。以下是我的代码片段:

private void setupPieChart() {

List<PieEntry> pieEntries = new ArrayList<>();

for (int i = 0; i < spend.length; i++) {
    pieEntries.add(new PieEntry(spend[i], categories[i]));
}
PieDataSet dataSet = new PieDataSet(pieEntries, "Spend Areas");
PieData data = new PieData(dataSet);
data.setValueTextSize(10);

PieChart chart = (PieChart) findViewById(R.id.piechart);
chart.setData(data);
chart.getDescription().setEnabled(false);

chart.invalidate();
dataSet.setColors(ColorTemplate.COLORFUL_COLORS);
chart.animateXY(5000, 5000);

我也试过通过以下方式设置自定义图例:

Legend l = chart.getLegend();
l.setTextColor(Color.BLACK);
l.setTextSize(10f);
l.setForm(Legend.LegendForm.SQUARE);
l.setFormSize(10f);
l.setXEntrySpace(5f);
l.setFormToTextSpace(10f);


   LegendEntry[] legendEntries=new LegendEntry[12];
    for(int i=0;i<legendEntries.length;i++)
    {
        LegendEntry entry=new LegendEntry();
        entry.formColor=MY_COLORS[i];
        entry.label=categories[i];
        legendEntries[i]=(entry);

    }
l.setCustom(legendEntries);

如果我将图例条目的数量设置为 2,这将起作用。对于任何超过 2 的数字,应用程序都会崩溃并出现以下错误:

Process: com.javahelps.mylifeapp, PID: 11444
java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.get(ArrayList.java:437)
at com.github.mikephil.charting.renderer.LegendRenderer.renderLegend(LegendRenderer.java:377)
at com.github.mikephil.charting.charts.PieChart.onDraw(PieChart.java:141)
at android.view.View.draw(View.java:21594)
at android.view.View.updateDisplayListIfDirty(View.java:20471)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4397)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4370)
at android.view.View.updateDisplayListIfDirty(View.java:20431)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4397)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4370)
at android.view.View.updateDisplayListIfDirty(View.java:20431)
at android.view.View.draw(View.java:21326)
at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
at android.view.View.updateDisplayListIfDirty(View.java:20462)
at android.view.View.draw(View.java:21326)
at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
at android.view.View.updateDisplayListIfDirty(View.java:20462)
at android.view.View.draw(View.java:21326)
at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
at android.view.View.updateDisplayListIfDirty(View.java:20462)
at android.view.View.draw(View.java:21326)
at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
at android.view.View.draw(View.java:21597)
at com.android.internal.policy.DecorView.draw(DecorView.java:813)
at android.view.View.updateDisplayListIfDirty(View.java:20471)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:580)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:586)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:659)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:3870)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3670)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2992)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1929)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7987)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1154)
at android.view.Choreographer.doCallbacks(Choreographer.java:977)
at android.view.Choreographer.doFrame(Choreographer.java:893)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1139)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)

有没有人遇到过类似的问题?

我认为问题在于以下一行:

entry.label=categories[i];

可以在该点设置断点查看。循环 运行 12 次,但类别 [] 大小小于 12。您需要替换以下行:

for(int i=0;i<legendEntries.length;i++)

与:

for(int i=0;i<pieEntries.size();i++)

您还需要执行以下操作:

LegendEntry[] legendEntries=new LegendEntry[pieEntries.size()];

这是因为图例等于图表中的条目数。通过这样做,将为每个条目创建此图例,您的问题将得到解决。祝你好运!