Skip to content

v.3.0.0-beta1 BarChart: ArrayIndexOutOfBoundsException when formatter applied, granularity is enabled and there's only one data point #2153

Closed
@antohama

Description

@antohama

Hi, I've faced an ArrayIndexOutOfBoundsException under following conditions:

  • AxisValueFormatter is applied to x axis, where formatted value is an item of a list;
  • granularity is enabled for x axis;
  • the data consists of only one value.

Here's the stacktrace:

java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1
at java.util.ArrayList.get(ArrayList.java:310)
at com.example.asuprun.tempconverter.AnotherActivity$1.getFormattedValue(AnotherActivity.java:65)
at com.github.mikephil.charting.components.AxisBase.getFormattedLabel(AxisBase.java:451)
at com.github.mikephil.charting.components.AxisBase.getLongestLabel(AxisBase.java:437)
at com.github.mikephil.charting.renderer.XAxisRenderer.computeSize(XAxisRenderer.java:78)
at com.github.mikephil.charting.renderer.XAxisRenderer.computeAxisValues(XAxisRenderer.java:73)
at com.github.mikephil.charting.renderer.XAxisRenderer.computeAxis(XAxisRenderer.java:66)
at com.github.mikephil.charting.charts.BarLineChartBase.notifyDataSetChanged(BarLineChartBase.java:339)
at com.github.mikephil.charting.charts.Chart.setData(Chart.java:318)
at com.example.asuprun.tempconverter.AnotherActivity.plotData(AnotherActivity.java:88)
at com.example.asuprun.tempconverter.AnotherActivity.toggleData(AnotherActivity.java:98)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

Simplified code:

public class AnotherActivity extends AppCompatActivity {
    private ViewGroup chartView;
    private Map<String, Integer> data;
    private BarChart chart;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chart_layout);

        chartView = (ViewGroup) findViewById(R.id.chart_view);
        chart = new BarChart(this);
        data = new LinkedHashMap<>();
        data.put("6/15", 36);
        data.put("8/15", 23);
        chartView.addView(chart);
        plotData();
    }

    private void plotData() {
        chart.clear();
        final ArrayList<String> xVals = new ArrayList<>();
        ArrayList<BarEntry> yVals = new ArrayList<>();

        for (Map.Entry<String, Integer> entry : data.entrySet()) {
            yVals.add(new BarEntry(xVals.size(), entry.getValue()));
            xVals.add(entry.getKey());
        }

        XAxis xAxis = chart.getXAxis();
        xAxis.setDrawGridLines(false);
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xAxis.setGranularityEnabled(true);
        xAxis.setValueFormatter(new AxisValueFormatter() {
                                    @Override
                                    public String getFormattedValue(float value, AxisBase axis) {
                                        try {
                                            return xVals.get((int) value);
                                        } catch (IndexOutOfBoundsException e) {
                                            e.printStackTrace();
                                            return "stub";
                                        }
                                    }

                                    @Override
                                    public int getDecimalDigits() {
                                        return 0;
                                    }
                                }
        );

        chart.getAxisRight().setEnabled(false);
        YAxis axisLeft = chart.getAxisLeft();
        axisLeft.setAxisMinValue(0f);
        axisLeft.setGranularityEnabled(true);
        axisLeft.setGranularity(1f);

        BarDataSet dataSet = new BarDataSet(yVals, "Data");
        BarData barData = new BarData(dataSet);
        barData.setBarWidth(0.7f);
        chart.setData(barData);
        chart.invalidate();
    }

    public void toggleData(View view) {
        if (data.size() > 1) {
            data.remove("8/15");
        } else {
            data.put("8/15", 23);
        }
        plotData();
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions