从改造回调 return 0 中使用 for 循环添加元素数组列表

add element arraylist with for loop from retrofit callback return 0

所以,我有这个数组列表为 MPChartAndroid yValues 添加元素。我想使用 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;
}

到目前为止,我已经完成了调用获取改造响应数据和循环添加元素的工作。当我循环添加元素到 arraylist 时,数据没有显示在图表中,当我试图点击应用程序时突然崩溃。

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;
}       

当它崩溃时我得到的错误总是说长度=0; index=0,但是当我 Log.d 它是 return 正确的数据。

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)
                         

感谢任何帮助。

所以我已经努力了几天来找到解决我的问题的方法,现在我来了。

制作一个新的方法来调用改造响应。

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) {

        }
    });
}

分配 response.body() 后的内部响应,执行 for 循环以在 arraylist 中添加元素。