Closed
Description
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
Labels
No labels