0

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 ?

droho
  • 61
  • 10
  • can you check if `chartBar.getAnimator()`, `chartBar.getViewPortHandler()` is not null? – Rahul Nov 08 '17 at 11:03
  • @RahulKumar I checked it and they are not null – droho Nov 08 '17 at 11:05
  • have you called `initBuffers` before calling this? – Rahul Nov 08 '17 at 11:07
  • @RahulKumar No, I don't. I found some tip to solve it: Make custom render Class that extends BarChartRenderer Override method drawDataSet (easiest approach is to copy over drawDataSet method code from BarChartRenderer.java) Change occurrences of "drawRect" to "drawRoundedRect" Set the renderer to your bar chart... barChart.setRenderer(new MyRenderer(barChart, barChart.getAnimator(), barChart.getViewPortHandler())); But I dont know how to Override the method – droho Nov 08 '17 at 11:09
  • i mean even calling `initBuffers` will do the job – Rahul Nov 08 '17 at 11:12
  • @RahulKumar can you show me on my code how to do this ? I'm try but when I call `initBuffers` I get **null** – droho Nov 08 '17 at 11:18
  • after `super` in MyBar... constructor, place `initBuffers()` – Rahul Nov 08 '17 at 11:25
  • @RahulKumar Thanks, a lot for your help, now it works but it rotate all my bars isted of only values, do you know how can I rotate only values ? – droho Nov 08 '17 at 11:38
  • unfortunately, I came here because of Android tag and I have not worked on this library. But once you understand the code of the library, you'll get it working. :-) – Rahul Nov 08 '17 at 11:40

0 Answers0