Hello,
Thank you for your great library.
We encounter a crash when using setHighLightFullBarEnabled in a CombinedChart.
To reproduce simply build the demo app, and in the CombinedChartActivity set to true the following option:
The same issue seems to have been fixed on the iOS port:
https://github.com/danielgindi/Charts/issues/1185
Here is the stacktrace:
com.xxmassdeveloper.mpchartexample E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.xxmassdeveloper.mpchartexample, PID: 24238
java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1
at java.util.ArrayList.get(ArrayList.java:413)
at com.github.mikephil.charting.data.CombinedData.getEntryForHighlight(CombinedData.java:185)
at com.github.mikephil.charting.charts.Chart.highlightValue(Chart.java:634)
at com.github.mikephil.charting.listener.ChartTouchListener.performHighlight(ChartTouchListener.java:124)
at com.github.mikephil.charting.listener.BarLineChartTouchListener.onSingleTapUp(BarLineChartTouchListener.java:611)
at android.view.GestureDetector.onTouchEvent(GestureDetector.java:635)
at com.github.mikephil.charting.listener.BarLineChartTouchListener.onTouch(BarLineChartTouchListener.java:112)
at com.github.mikephil.charting.charts.BarLineChartBase.onTouchEvent(BarLineChartBase.java:556)
at android.view.View.dispatchTouchEvent(View.java:9942)
I second that, same problem encountered here!
Hello!
I faced the same problem using CombinedChart.
This occurred when highlighting value programatically.
mChart.highlightValue();
The error happens in getEntryForHighlight() method of CombinedData.java
When switching to simply BarChart - the problem doesn't exists.
Hope it will be helpful.
Thanks for your workaround but we have to use combined chart...
I am also getting the same issue using combined chart as devrtech is getting by using
I need to use the combined chart not the barchart for my thing. I would appreciate if any solution could be provided.
Stack trace is here:
Process: com.example.admin.groupfull, PID: 22233
java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1
at java.util.ArrayList.get(ArrayList.java:310)
at com.github.mikephil.charting.data.CombinedData.getEntryForHighlight(CombinedData.java:185)
at com.github.mikephil.charting.charts.Chart.highlightValue(Chart.java:634)
at com.github.mikephil.charting.listener.ChartTouchListener.performHighlight(ChartTouchListener.java:124)
at com.github.mikephil.charting.listener.BarLineChartTouchListener.onSingleTapUp(BarLineChartTouchListener.java:611)
at android.view.GestureDetector.onTouchEvent(GestureDetector.java:635)
at com.github.mikephil.charting.listener.BarLineChartTouchListener.onTouch(BarLineChartTouchListener.java:112)
at com.github.mikephil.charting.charts.BarLineChartBase.onTouchEvent(BarLineChartBase.java:556)
at android.view.View.dispatchTouchEvent(View.java:9303)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2549)
I've faced the same bug.
I've tried also setting the highlight entry manually instead of automatically with combinedChart.highlightValue(entry.getX(), 1, false);
but the error persist.
I managed, in a roundabout way:
public void select(float x) {
ScatterData scatterData = mChart.getScatterData();
for (int dsIndex = 0 ; dsIndex < scatterData.getDataSetCount() ; dsIndex++) {
IScatterDataSet ds = scatterData.getDataSetByIndex(dsIndex);
for (int entryIndex = 0; entryIndex < ds.getEntryCount(); entryIndex++) {
Entry entry = ds.getEntryForIndex(entryIndex);
if (entry.x == x) {
Highlight highlight = new Highlight(entry.getX(), entry.getY(), dsIndex);
highlight.setDataIndex(mChart.getData().getDataIndex(scatterData));
mChart.highlightValue(highlight, false);
return;
}
}
}
mChart.highlightValue(0, -1, false);
}
It seems that if I already have the Entry I should be able to just say "highlight this", but alas... :)
Have the same problem. @PhilJay please help
I manage it to work finally after debugging library
`
Highlight highlight = new Highlight(valX, Float.NaN, 0);
highlight.setDataIndex(your_chart_data_index); // IMPORTANT set it to value regarding CombinedData#getAllData() order
highlightValue(highlight);
`
@Override
public Highlight getHighlightByTouchPoint(float x, float y) {
if (mData == null) {
Log.e(LOG_TAG, "Can't select by touch. No data set.");
return null;
} else {
Highlight h = getHighlighter().getHighlight(x, y);
if (h == null || !isHighlightFullBarEnabled()) return h;
// For isHighlightFullBarEnabled, remove stackIndex
Highlight highlight = new Highlight(h.getX(), h.getY(), h.getXPx(), h.getYPx(), h
.getDataSetIndex(), -1, h.getAxis());
// modify this
highlight.setDataIndex(h.getDataIndex());
return highlight;
}
}
Because the Highlight will new one when isHighlightFullBarEnabled is true , and the variable 'mDataIndex' becomes -1 . it makes ArrayIndexOutOfBoundsException.
So keep the 'mDataIndex'.
You can override it in class "CombinedChart" or extend "CombinedChart".
It works for me.
@PhilJay I am facing the same issue. I am using v3.0.3 (Can't use latest version as we have to be on same version as our other module which uses MP charts) and I see by default highLightFullBarEnabled() is set to true. But, it is not working and when I again explicitly try to set it to true, it crashes. Tried above workarounds, but no luck. Can you please help with this?
@override
public Highlight getHighlightByTouchPoint(float x, float y) {if (mData == null) { Log.e(LOG_TAG, "Can't select by touch. No data set."); return null; } else { Highlight h = getHighlighter().getHighlight(x, y); if (h == null || !isHighlightFullBarEnabled()) return h; // For isHighlightFullBarEnabled, remove stackIndex Highlight highlight = new Highlight(h.getX(), h.getY(), h.getXPx(), h.getYPx(), h .getDataSetIndex(), -1, h.getAxis()); // modify this highlight.setDataIndex(h.getDataIndex()); return highlight; } }Because the Highlight will new one when isHighlightFullBarEnabled is true , and the variable 'mDataIndex' becomes -1 . it makes ArrayIndexOutOfBoundsException.
So keep the 'mDataIndex'.
You can override it in class "CombinedChart" or extend "CombinedChart".
It works for me.
@laumancheuck I tried the exact way, but not working for me. Did you find any other workaround? Please help me.
I manage it to work finally after debugging library
`
Highlight highlight = new Highlight(valX, Float.NaN, 0);highlight.setDataIndex(your_chart_data_index); // IMPORTANT set it to value regarding CombinedData#getAllData() order
highlightValue(highlight);
`
@biokys I tried the exact way, but not working for me. Did you find any other workaround? Please help me.
Most helpful comment
I manage it to work finally after debugging library
`
Highlight highlight = new Highlight(valX, Float.NaN, 0);
highlight.setDataIndex(your_chart_data_index); // IMPORTANT set it to value regarding CombinedData#getAllData() order
highlightValue(highlight);
`