Легенда PieChart, отображающая только 1 из 12 категорий, представленных в MP Android Chart - PullRequest
0 голосов
/ 02 ноября 2019

Раньше я использовал круговую диаграмму из 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)

Кто-нибудь сталкивался с подобной проблемой?

1 Ответ

0 голосов
/ 08 ноября 2019

Я думаю, что проблема заключается в следующей строке:

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()];

Это потому, что легенда будет равна количеству записей в вашей диаграмме. При этом легенда будет создана для каждой записи, и ваша проблема будет решена. Желаем удачи!

...