Search code examples
javaandroidretrofit2mpandroidchart

add element arraylist with for loop from retrofit callback return 0


So, i have this arraylist add element for MPChartAndroid yValues. I want to for loop add element from database with Retrofit2.

    private ArrayList<BarEntry> sehat() {
    ArrayList<BarEntry> dataEntries = new ArrayList<>();
    dataEntries.add(new BarEntry(1, 2));
    dataEntries.add(new BarEntry(2, 1));
    dataEntries.add(new BarEntry(3, 1));
    dataEntries.add(new BarEntry(4, 4));
    dataEntries.add(new BarEntry(5, 3));
    dataEntries.add(new BarEntry(6, 7));
    dataEntries.add(new BarEntry(7, 7));
    dataEntries.add(new BarEntry(8, 3));
    dataEntries.add(new BarEntry(9, 7));
    dataEntries.add(new BarEntry(10, 7));

    return dataEntries;
}

so far what I've done to call get retrofit response data and loop add element. when I loop adding element to arraylist the data didn't showed in chart and when I tried to click app suddenly crased.

private ArrayList<BarEntry> sehat() {
    ArrayList<BarEntry> dataEntries = new ArrayList<>();
    Call<List<Data>> call = userService.getDataArr();
    call.enqueue(new Callback<List<Data>>() {
        @Override
        public void onResponse(Call<List<Data>> call, Response<List<Data>> response) {
            List<Data> data = response.body();
            int i = 0;
            int yVal[] = new int[data.size()];
            for(Data get: data){
                yVal[i] = get.getCnrp();
                dataEntries.add(new BarEntry(i, yVal[i])); 
                i++;
                Log.d("testing", " " + yVal);
            }
        }

        @Override
        public void onFailure(Call<List<Data>> call, Throwable t) {

        }
    });
    
    return dataEntries;
}       

Error that I got when it crashed always said length=0; index=0, but when I Log.d it's return right data.

2020-07-21 16:59:29.453 15766-15766/com.example.baseapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.baseapplication, PID: 15766
java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
    at com.github.mikephil.charting.buffer.BarBuffer.addBar(BarBuffer.java:37)
    at com.github.mikephil.charting.buffer.BarBuffer.feed(BarBuffer.java:80)
    at com.github.mikephil.charting.renderer.BarChartRenderer.drawDataSet(BarChartRenderer.java:142)
    at com.github.mikephil.charting.renderer.BarChartRenderer.drawData(BarChartRenderer.java:80)
    at com.github.mikephil.charting.charts.BarLineChartBase.onDraw(BarLineChartBase.java:232)
    at android.view.View.draw(View.java:20207)
    at android.view.View.updateDisplayListIfDirty(View.java:19082)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4317)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4290)
    at android.view.View.updateDisplayListIfDirty(View.java:19042)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4317)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4290)
    at android.view.View.updateDisplayListIfDirty(View.java:19042)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4317)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4290)
    at android.view.View.updateDisplayListIfDirty(View.java:19042)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4317)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4290)
    at android.view.View.updateDisplayListIfDirty(View.java:19042)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4317)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4290)
    at android.view.View.updateDisplayListIfDirty(View.java:19042)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4317)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4290)
    at android.view.View.updateDisplayListIfDirty(View.java:19042)
    at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:686)
    at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:692)
    at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:801)
    at android.view.ViewRootImpl.draw(ViewRootImpl.java:3311)
    at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3115)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2484)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
    at android.view.Choreographer.doCallbacks(Choreographer.java:761)
    at android.view.Choreographer.doFrame(Choreographer.java:696)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
                         

I appreciate any help.


Solution

  • So I've been struggling for a few days to find a solution to my problem and here I am.

    Make a new method to called retrofit response.

    public void getData(){
        Call<BaChart> call = userService.init();
        call.enqueue(new Callback<BaChart>() {
            @Override
            public void onResponse(Call<BaChart> call, Response<BaChart> response) {
                BaChart baChart = response.body();
                int i;
                ArrayList<BarEntry> sehat= new ArrayList<>();
                for( i = 0; i < baChart.getTidakSehat().size(); i++ ){
                    BarEntry value = new BarEntry(i, 0);
                    sehat.add(value);
                }
    
                //do stuff with arraylist
    
            }
    
            @Override
            public void onFailure(Call<BaChart> call, Throwable t) {
    
            }
        });
    }
    

    Inside response after assigned response.body(), do for loop to add element in arraylist.