Как добавить данные из Firebase в GraphView динамически? - PullRequest
0 голосов
/ 10 декабря 2018

Я использую библиотеку jjoe64.graphview.GraphView для построения графика.

Я добавляю некоторые данные из базы данных Firebase, но здесь отображается ошибка.

здесьмой код:

 FirebaseDatabase realdata = FirebaseDatabase.getInstance();
        DatabaseReference real = realdata.getReference("weight");
        ValueEventListener workplz = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

//point value=62,pointvalue1=76
                pointValue = Integer.parseInt(String.valueOf(dataSnapshot.child("currentweight").getValue()));
                pointValue1 = Integer.parseInt(String.valueOf(dataSnapshot.child("goalweight").getValue()));
                Log.i("xValue", String.valueOf(pointValue));
                Log.i("yValue", String.valueOf(pointValue1));


                valuedata = Double.parseDouble(String.valueOf(dataSnapshot.child("currentweight").getValue()));
                hello();
                }
                public void onCancelled(@NonNull DatabaseError databaseError) {
                }};
        real.addValueEventListener(workplz);

        GraphView graph = findViewById(R.id.graph);
        LineGraphSeries<DataPoint> series = new LineGraphSeries<>(new DataPoint[]{
                new DataPoint(0, 1),
                new DataPoint(1, 5),
                new DataPoint(2, 3)
        });
        graph.addSeries(series);
        graph.getViewport().setXAxisBoundsManual(true);
        graph.getViewport().setYAxisBoundsManual(true);
        graph.getViewport().setMinY(0);
        graph.getViewport().setMaxY(200);
        graph.getViewport().setMaxX(0);
        graph.getViewport().setMaxX(200);
        //appending data 
        series.appendData(new DataPoint(pointValue, pointValue1), true, 200);

Во время работы приложения я получаю эту ошибку.

 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference
    at com.example.itsandpro.Signup.GraphActivity.onCreate(GraphActivity.java:97)
    at android.app.Activity.performCreate(Activity.java:6679)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6119) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

Я хочу добавить эти два значения в график. Я также пытался использовать эти значенияв двойном, но все равно ошибка такая же как:

   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'double java.lang.Double.doubleValue()' on a null object reference
    at com.example.itsandpro.Signup.GraphActivity.onCreate(GraphActivity.java:85)
    at android.app.Activity.performCreate(Activity.java:6679)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6119) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

1 Ответ

0 голосов
/ 11 декабря 2018

В соответствии с вашим комментарием, в котором вы говорите, что получаете эти значения, но по-прежнему получаете ошибки, это связано с тем, что API Firebase является асинхронным, то есть к моменту создания следующего объекта:

new DataPoint(pointValue, pointValue1), true, 200

Данные, поступающие из базы данных, еще не загружены.Быстрое решение этой проблемы - переместить все эти строки кода:

GraphView graph = findViewById(R.id.graph);
LineGraphSeries<DataPoint> series = new LineGraphSeries<>(new DataPoint[]{
    new DataPoint(0, 1),
    new DataPoint(1, 5),
    new DataPoint(2, 3)
});
graph.addSeries(series);
graph.getViewport().setXAxisBoundsManual(true);
graph.getViewport().setYAxisBoundsManual(true);
graph.getViewport().setMinY(0);
graph.getViewport().setMaxX(0);
graph.getViewport().setMaxX(200);
//appending data 
series.appendData(new DataPoint(pointValue, pointValue1), true, 200);

Внутри метода onDataChange(), в противном случае я рекомендую вам увидеть последнюю часть моего ответа из этого пост , в котором я объяснил, как это можно сделать с помощью пользовательского обратного вызова.Вы также можете взглянуть на это видео для лучшего понимания.

...