I have HorizontalBarChart from MPandroidchart, I want to rotate values for each bar. I created class MyBarChartRender.java
but when I put it into chartBar.setRender(), I get an error:
java.lang.NullPointerException: Attempt to read from null array
at com.github.mikephil.charting.renderer.BarChartRenderer.drawDataSet(BarChartRenderer.java:136)
at com.github.mikephil.charting.renderer.BarChartRenderer.drawData(BarChartRenderer.java:80)
at com.github.mikephil.charting.charts.BarLineChartBase.onDraw(BarLineChartBase.java:231)
at android.view.View.draw(View.java:17189)
at android.view.View.updateDisplayListIfDirty(View.java:16171)
at android.view.View.draw(View.java:16955)
at android.view.ViewGroup.drawChild(ViewGroup.java:3727)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513)
at android.view.View.updateDisplayListIfDirty(View.java:16166)
at android.view.View.draw(View.java:16955)
at android.view.ViewGroup.drawChild(ViewGroup.java:3727)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513)
at android.view.View.updateDisplayListIfDirty(View.java:16166)
at android.view.View.draw(View.java:16955)
at android.view.ViewGroup.drawChild(ViewGroup.java:3727)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513)
at android.view.View.draw(View.java:17192)
at android.widget.ScrollView.draw(ScrollView.java:1737)
at android.view.View.updateDisplayListIfDirty(View.java:16171)
at android.view.View.draw(View.java:16955)
at android.view.ViewGroup.drawChild(ViewGroup.java:3727)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513)
at android.view.View.draw(View.java:17192)
at android.view.View.updateDisplayListIfDirty(View.java:16171)
at android.view.View.draw(View.java:16955)
at android.view.ViewGroup.drawChild(ViewGroup.java:3727)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513)
at android.view.View.updateDisplayListIfDirty(View.java:16166)
at android.view.View.draw(View.java:16955)
at android.view.ViewGroup.drawChild(ViewGroup.java:3727)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513)
at android.view.View.updateDisplayListIfDirty(View.java:16166)
at android.view.View.draw(View.java:16955)
at android.view.ViewGroup.drawChild(ViewGroup.java:3727)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513)
at android.view.View.updateDisplayListIfDirty(View.java:16166)
at android.view.View.draw(View.java:16955)
at android.view.ViewGroup.drawChild(ViewGroup.java:3727)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513)
at android.view.View.updateDisplayListIfDirty(View.java:16166)
at android.view.View.draw(View.java:16955)
at android.view.ViewGroup.drawChild(ViewGroup.java:3727)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513)
at android.view.View.draw(View.java:17192)
at com.android.internal.policy.DecorView.draw(DecorView.java:756)
at android.view.View.updateDisplayListIfDirty(View.java:16171)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:648)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:654)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:762)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2800)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2608)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2215)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6344)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
at android.view.Choreographer.doCallbacks(Choreographer.java:686)
at android.view.Choreographer.doFrame(Choreographer.java:621)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6186)
at java.lang.reflect.Method.invoke(Native Method)
I don't know from which array it try to read so I have no idea how to solve this problem by myself.
MyBarChartRender.java:
public class MyBarChartRender extends BarChartRenderer {
public MyBarChartRender(BarDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) {
super(chart, animator, viewPortHandler);
}
public void drawValue(Canvas c, IValueFormatter formatter, String value, Entry entry, int dataSetIndex, float x, float y, int color) {
// super.drawValue(c, formatter, value, entry, dataSetIndex, x, y, color);
Paint paint=super.mDrawPaint;
paint.setTextSize(25f);
paint.setTextAlign(Paint.Align.CENTER);
paint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD));
Utils.drawXAxisValue(c,value,x,y,paint, MPPointF.getInstance(),90);
}}
BarChart:
BarDataSet barDataSet = new BarDataSet(barEntries, "");
BarData barData = new BarData(barDataSet);
barData.setBarWidth(1f);
barData.setValueFormatter(new MyValueFormatter());
barData.setValueTextSize(9);
barDataSet.setColors(colors);
chartBar.setData(barData);
chartBar.setVisibleXRangeMaximum(howMany);
chartBar.setDescription(null);
chartBar.setVerticalScrollBarEnabled(true);
chartBar.setHorizontalScrollBarEnabled(false);
chartBar.getXAxis().setDrawAxisLine(false);
chartBar.setDrawBorders(false);
chartBar.getAxisRight().setDrawAxisLine(false);
chartBar.getAxisRight().setDrawGridLines(false);
chartBar.getAxisRight().setDrawGridLines(false);
chartBar.getAxisRight().setDrawLabels(false);
chartBar.getLegend().setEnabled(false);
chartBar.setScaleEnabled(false);
chartBar.setTouchEnabled(false);
chartBar.getAxisLeft().setDrawGridLines(false);
chartBar.getAxisLeft().setDrawLabels(false);
chartBar.getAxisLeft().setDrawAxisLine(false);
chartBar.getAxisLeft().setDrawGridLines(false);
chartBar.getAxisLeft().setAxisMinimum(0f);
chartBar.setRenderer(new MyBarChartRender(chartBar,chartBar.getAnimator(),chartBar.getViewPortHandler()));
chartBar.getXAxis().setDrawGridLines(false);
chartBar.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM);
chartBar.getXAxis().setDrawLabels(true);
chartBar.getXAxis().setTextSize(12);
XAxis xAxis = chartBar.getXAxis();
xAxis.setLabelCount(howMany);
xAxis.setLabelRotationAngle(90);
xAxis.setValueFormatter(new MyXAxisValueFormatter(partiesName));
xAxis.setGranularity(1f);
I have no idea what is wrong. Before I try to use render every thing works fine.
EDIT:
Error problem is solved but using MyBarChartRender.java
rotate bars and values. How can I make it to rotate only values ?