AnyChart-Android icon indicating copy to clipboard operation
AnyChart-Android copied to clipboard

Rest Api data not Updating in real time

Open asif1261 opened this issue 5 years ago • 5 comments

First time Loading data correctly, but second time graph doesn't updating the data.

public class OpdIpdAnalysis extends AppCompatActivity implements NetworkReceiver.ConnectionChangeCallback {

 AnyChartView anyChartView;
 Set set1;
 
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_opd_ipd_analysis);
		
		anyChartView = findViewById(R.id.anyChartLineChart);
        anyChartView.setProgressBar(myProgressBar);
		
		}
		
	private void anyChartGraphViewData(Response<OpdIpdModel.ModelResponse> response) {

        if (anyChartView != null && anyChartView.isActivated()){
            anyChartView.clear();
        }
        Cartesian cartesian = AnyChart.line();
        cartesian.animation(true);
        cartesian.padding(5d, 10d, 1d, 5d);

        cartesian.crosshair().enabled(true);
        cartesian.crosshair()
                .yLabel(true)
                // TODO ystroke
                .yStroke((Stroke) null, null, null, (String) null, (String) null);

        cartesian.tooltip().positionMode(TooltipPositionMode.POINT);
        cartesian.title("MIS Report of comparing OPD and IPD data.");

        //cartesian.yAxis(0).title("Number of Patient admitted in");
        cartesian.xAxis(0).labels().padding(1d, 1d, 1d, 1d);
        cartesian.xAxis(0).labels().fontSize(8);

        /* Customization Done  */

        List<DataEntry> entries1 = new ArrayList<>();
        //List<DataEntry> entries2 = new ArrayList<>();
        final List<String> xLabel = new ArrayList<>();


        if (response.body() != null) {
            for (OpdIpdModel opdIpdModel : response.body().getOpdIpdComparison()) {

                xLabel.add(opdIpdModel.getYear().shortValue() + "-" + opdIpdModel.getMonthString());

                entries1.add(new CustomDataEntry(xLabel, opdIpdModel.getoPD(), opdIpdModel.getiPD()));
                //entries2.add(new CustomDataEntry(xLabel, opdIpdModel.getoPD(), opdIpdModel.getiPD()));
            }
        }

        set1 = Set.instantiate();
        set1.data(entries1);
        Mapping series1Mapping = set1.mapAs("{ x: 'x', value: 'value1' }");

        //set2 = Set.instantiate();
        //set2.data(entries2);
        Mapping series2Mapping = set1.mapAs("{ x: 'x', value: 'value2' }");


        Line series1 = cartesian.line(series1Mapping);
        series1.name("OPD");
        series1.hovered().markers().enabled(true);
        series1.hovered().markers()
                .type(MarkerType.CIRCLE)
                .size(5d);
        series1.tooltip()
                .position("right")
                .anchor(Anchor.LEFT_CENTER)
                .offsetX(0d)
                .offsetY(0d);

        Line series2 = cartesian.line(series2Mapping);
        series2.name("IPD");
        series2.hovered().markers().enabled(true);
        series2.hovered().markers()
                .type(MarkerType.CIRCLE)
                .size(5d);
        series2.tooltip()
                .position("right")
                .anchor(Anchor.LEFT_CENTER)
                .offsetX(0d)
                .offsetY(0d);

        cartesian.legend().enabled(true);
        cartesian.legend().fontSize(10d);
        cartesian.legend().padding(0d, 0d, 10d, 0d);
        cartesian.interactivity().hoverMode(HoverMode.BY_X);
        //cartesian.xZoom(3);
        cartesian.xScroller(true);
        //cartesian.notifyDataChanged();

        anyChartView.setZoomEnabled(true);
        anyChartView.setChart(cartesian);
        anyChartView.refreshDrawableState();
        anyChartView.invalidate();
        //anyChartView.notify();
    }

private class CustomDataEntry extends ValueDataEntry {

        CustomDataEntry(List<String> x, Number value, Number value2) {
            super(String.valueOf(x), value);
            setValue("value1", value);
            setValue("value2", value2);
        }

    }

	private void allOpdIpdData(String department_id) {

        call = service.getAllOpdIpdData("/Report/GetOpdIpdComparison?departmentId=" + department_id);
        call.enqueue(new Callback<OpdIpdModel.ModelResponse>() {
            @Override
            public void onResponse(@NotNull Call<OpdIpdModel.ModelResponse> call, @NotNull Response<OpdIpdModel.ModelResponse> response) {
                myProgressBar.setVisibility(View.GONE);
                if (response.isSuccessful() && response.body() != null) {

                    updateUI(response.body().getOpdIpdComparison());
                    //graphData(response);
                    /*if (anyChartView != null && anyChartView.isEnabled()){
                        anyChartView.clear();
                    }*/
                    anyChartGraphViewData(response);

                } else {

                    if (response.code() == 401) {
                        startActivity(new Intent(OpdIpdAnalysis.this, LoginActivity.class));
                        finish();
                        tokenManager.deleteToken();
                        Toast.makeText(OpdIpdAnalysis.this, "User session expired, Login again", Toast.LENGTH_LONG).show();
                    }
                }
            }

            @Override
            public void onFailure(@NotNull Call<OpdIpdModel.ModelResponse> call, @NotNull Throwable t) {
                myProgressBar.setVisibility(View.GONE);
                //displaySnackbar("Network Status: " + t.getMessage(), "#f5003d", 3000);

                Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "Network Status: " + t.getMessage(), Snackbar.LENGTH_LONG);
                View snackbarView = snackbar.getView();
                snackbarView.setBackgroundColor(Color.parseColor("#f5003d"));
                TextView tv = snackbarView.findViewById(R.id.snackbar_text);
                tv.setTextColor(Color.WHITE);
                snackbar.show();
            }
        });
    }
	
	}

asif1261 avatar Feb 09 '20 10:02 asif1261

@asif1261 There's no need to recreate the chart to update the data. All you need is to apply new data to the existing chart. The same issue was raised previously and the solution was provided in my comments below. Please, check that thread, this should help you.

Shestac92 avatar Feb 10 '20 02:02 Shestac92

@Shestac92 I still can't find where I did wrong!! Any insight will be very appreciated

asif1261 avatar Feb 10 '20 05:02 asif1261

@Shestac92 can you please point me out where to change!! Here is My hole code:

public class OpdIpdAnalysis extends AppCompatActivity implements NetworkReceiver.ConnectionChangeCallback {

   
    ProgressBar myProgressBar;
    ApiService service;
    TokenManager tokenManager;
    //Spinner calling
    MaterialSpinner spinner;
    TextView tv_check_connection;
    LinearLayout connection;
    Animation slideDownToUp;
    MyAsyncTask myAsyncTask;
    private NetworkReceiver networkReceiver = new NetworkReceiver();
    private ListView mListView;
    private Call<List<OpdIpdModel.OpdIpdDepartmentModel>> callDepartment;
    private Call<OpdIpdModel.ModelResponse> call;
    private RelativeLayout relativeLayout;
    private LinearLayout linearLayoutMainOPdIpd;
    //GraphView
    //private LineChart mLineChart;
    AnyChartView anyChartView;
    Cartesian cartesian;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_opd_ipd_analysis);

        tokenManager = TokenManager.getInstance(getSharedPreferences("prefs", MODE_PRIVATE));
        service = RetrofitBuilder.createServiceWithAuth(ApiService.class, tokenManager);

        //Layout
        relativeLayout = findViewById(R.id.opd_ipd_analysis);
        linearLayoutMainOPdIpd = findViewById(R.id.linearLayoutMainOPdIpd);

        //Network available State Listener and monitoring State change connection code goes from here
        //neworkAvailable();

        IntentFilter intentFilter1 = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
        registerReceiver(networkReceiver, intentFilter1);
        networkReceiver.setConnectionChangeCallback(this);

        //Casting
        myProgressBar = findViewById(R.id.myProgressBar);
        myProgressBar.setScaleY(1.2f);
        myProgressBar.setIndeterminate(true);
        myProgressBar.setVisibility(View.VISIBLE);

        spinner = findViewById(R.id.spinner);

        mListView = findViewById(R.id.mListView);
        
        anyChartView = findViewById(R.id.anyChartLineChart);
        anyChartView.setProgressBar(myProgressBar);
        //anyChartView.setChart(cartesian);
    
        //all animation code goes from here
        slideDownToUp = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.slide_down_to_up);

        //toolbar code goes here
        toolbarOpdIpdReport = findViewById(R.id.opdIpdReportToolbar);
        setSupportActionBar(toolbarOpdIpdReport);

        //code for enable back pressed state
        if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
        }

        tv_check_connection = findViewById(R.id.tv_check_connection_opdipd);
        connection = findViewById(R.id.check_connection_opdipd);

        //Network call
        //networkAvailable();
        //anyChartGraphViewData();

    }

    private void anyChartGraphViewData(Response<OpdIpdModel.ModelResponse> response) {

        /*if (anyChartView != null && cartesian != null && anyChartView.isEnabled()){
            cartesian.removeAllSeries();
            cartesian.dispose();
            //anyChartView.clear();
            anyChartView.setChart(cartesian);
        }*/

        cartesian = AnyChart.area();
        cartesian.animation(true);
        cartesian.padding(5d, 10d, 1d, 5d);

        cartesian.crosshair().enabled(true);
        cartesian.crosshair()
                .yLabel(true)
                // TODO ystroke
                .yStroke((Stroke) null, null, null, (String) null, (String) null);

        cartesian.tooltip().positionMode(TooltipPositionMode.POINT);
        cartesian.title("MIS Report of comparing OPD and IPD data.");

        //cartesian.yAxis(0).title("Number of Patient admitted in");
        cartesian.xAxis(0).labels().padding(1d, 1d, 1d, 1d);
        cartesian.xAxis(0).labels().fontSize(8);

        List<DataEntry> entries1 = new ArrayList<>();       
        final List<String> xLabel = new ArrayList<>();
        Set set1 = Set.instantiate();

        if (response.body() != null) {
            for (OpdIpdModel opdIpdModel : response.body().getOpdIpdComparison()) {

                xLabel.add(opdIpdModel.getYear().shortValue() + "-" + opdIpdModel.getMonthString());

                entries1.add(new CustomDataEntry(xLabel, opdIpdModel.getoPD(), opdIpdModel.getiPD()));
              opdIpdModel.getiPD()));
                set1.data(entries1);
            }
        }

        //set1.data(entries1);
        cartesian.removeAllSeries();
        Mapping series1Mapping = set1.mapAs("{ x: 'x', value: 'value1' }");        
        Mapping series2Mapping = set1.mapAs("{ x: 'x', value: 'value2' }");

        Area series1 = cartesian.area(series1Mapping);
        series1.name("OPD");
        series1.hovered().markers().enabled(true);
        series1.hovered().markers()
                .type(MarkerType.CIRCLE)
                .size(5d);
        series1.tooltip()
                .position("right")
                .anchor(Anchor.LEFT_CENTER)
                .offsetX(0d)
                .offsetY(0d);

        Area series2 = cartesian.area(series2Mapping);
        series2.name("IPD");
        series2.hovered().markers().enabled(true);
        series2.hovered().markers()
                .type(MarkerType.CIRCLE)
                .size(5d);
        series2.tooltip()
                .position("right")
                .anchor(Anchor.LEFT_CENTER)
                .offsetX(0d)
                .offsetY(0d);

        cartesian.legend().enabled(true);
        cartesian.legend().fontSize(10d);
        cartesian.legend().padding(0d, 0d, 10d, 0d);
        cartesian.interactivity().hoverMode(HoverMode.BY_X);
        //cartesian.xZoom(3);
        cartesian.xScroller(true);

        //anyChartView.setZoomEnabled(true);
        //anyChartView.clear();
        anyChartView.refreshDrawableState();
        anyChartView.invalidate();
        anyChartView.setChart(cartesian);

        //anyChartView.notify();
    }

    private class CustomDataEntry extends ValueDataEntry {

        CustomDataEntry(List<String> x, Number value, Number value2) {
            super(String.valueOf(x), value);
            setValue("value1", value);
            setValue("value2", value2);
        }
    }

    private void networkAvailable() {

        IntentFilter intentFilter = new IntentFilter(NetworkReceiver.NETWORK_AVAILABLE_ACTION);
        LocalBroadcastManager.getInstance(this).registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                boolean isNetworkAvailable = intent.getBooleanExtra(IS_NETWORK_AVAILABLE, false);
                String networkStatus = "Back online";

                if (isNetworkAvailable) {
                    tv_check_connection.setText(networkStatus);
                    connection.setBackgroundColor(Color.parseColor("#5ec639"));
                    //connection.startAnimation(slideDownToUp);
                    tv_check_connection.setTextColor(Color.WHITE);

                    Handler handler = new Handler();
                    Runnable delayRunnable = new Runnable() {
                        @Override
                        public void run() {
                            if (tv_check_connection != null) {
                                tv_check_connection.setVisibility(View.GONE);
                            }
                        }
                    };
                    handler.postDelayed(delayRunnable, 1500);
                }
            }
        }, intentFilter);
    }

    //Table list data calling method
    private void updateUI(List<OpdIpdModel> OpdIpdComparison) {

        ListViewAdapter adapter = new ListViewAdapter(OpdIpdComparison, this);

        mListView.setAdapter(adapter);

    }

    private void spinnerData() {
        spinner.setSelection(0);
        myProgressBar.setVisibility(View.GONE);
        callDepartment = service.getAllOpdIpdDepartments();

        callDepartment.enqueue(new Callback<List<OpdIpdModel.OpdIpdDepartmentModel>>() {
            @Override
            public void onResponse(@NotNull Call<List<OpdIpdModel.OpdIpdDepartmentModel>> call, @NotNull Response<List<OpdIpdModel.OpdIpdDepartmentModel>> response) {
                //myProgressBar.setVisibility(View.GONE);
                //List for spinner data fetching
                final List<OpdIpdModel.OpdIpdDepartmentModel> departmentLists;
                if (response.isSuccessful() && response.body() != null) {
                    List<String> spinnerLists = new ArrayList<String>();
                    departmentLists = response.body();

                    for (int i = 0; i < departmentLists.size(); i++) {
                        spinnerLists.add(departmentLists.get(i).getName());
                    }

                    ArrayAdapter<String> departmentAdapter = new ArrayAdapter<>(OpdIpdAnalysis.this, android.R.layout.simple_spinner_item, spinnerLists); //new ArrayList<String>()
                    departmentAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                    spinner.setAdapter(departmentAdapter);

                    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                        @Override
                        public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
                            if (position != -1) {
                                myProgressBar.setVisibility(View.VISIBLE);
                                String department_id = departmentLists.get(position).getId().toString();
                                allOpdIpdData(department_id);
                            }
                        }

                        @Override
                        public void onNothingSelected(AdapterView<?> adapterView) {
                        }
                    });

                } else {

                    if (response.code() == 401) {
                        startActivity(new Intent(OpdIpdAnalysis.this, LoginActivity.class));
                        finish();
                        tokenManager.deleteToken();
                        Toast.makeText(OpdIpdAnalysis.this, "User session expired, Login again", Toast.LENGTH_LONG).show();
                    }
                }
            }

            @Override
            public void onFailure(@NotNull Call<List<OpdIpdModel.OpdIpdDepartmentModel>> call, @NotNull Throwable t) {

                //displaySnackbar("Network Status: " + t.getMessage(), "#f5003d", 3000);

                Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "Network Status: " + t.getMessage(), Snackbar.LENGTH_LONG);
                View snackbarView = snackbar.getView();
                snackbarView.setBackgroundColor(Color.parseColor("#f5003d"));
                TextView tv = snackbarView.findViewById(R.id.snackbar_text);
                tv.setTextColor(Color.WHITE);
                snackbar.show();
            }
        });
    }

    //Single Calling method
    private void allOpdIpdData(String department_id) {

        call = service.getAllOpdIpdData("/Report/GetOpdIpdComparison?departmentId=" + department_id);
        call.enqueue(new Callback<OpdIpdModel.ModelResponse>() {
            @Override
            public void onResponse(@NotNull Call<OpdIpdModel.ModelResponse> call, @NotNull Response<OpdIpdModel.ModelResponse> response) {
                myProgressBar.setVisibility(View.GONE);
                if (response.isSuccessful() && response.body() != null) {

                    updateUI(response.body().getOpdIpdComparison());
                    //graphData(response);
                    /*if (anyChartView != null && anyChartView.isEnabled()){
                        anyChartView.clear();
                    }*/
                    anyChartGraphViewData(response);

                } else {

                    if (response.code() == 401) {
                        startActivity(new Intent(OpdIpdAnalysis.this, LoginActivity.class));
                        finish();
                        tokenManager.deleteToken();
                        Toast.makeText(OpdIpdAnalysis.this, "User session expired, Login again", Toast.LENGTH_LONG).show();
                    }
                }
            }

            @Override
            public void onFailure(@NotNull Call<OpdIpdModel.ModelResponse> call, @NotNull Throwable t) {
                myProgressBar.setVisibility(View.GONE);
                //displaySnackbar("Network Status: " + t.getMessage(), "#f5003d", 3000);

                Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "Network Status: " + t.getMessage(), Snackbar.LENGTH_LONG);
                View snackbarView = snackbar.getView();
                snackbarView.setBackgroundColor(Color.parseColor("#f5003d"));
                TextView tv = snackbarView.findViewById(R.id.snackbar_text);
                tv.setTextColor(Color.WHITE);
                snackbar.show();
            }
        });
    }

    //Synchronous Network connection checking with retrofit call code method goes here
    @Override
    public void onConnectionChange(boolean isConnected) {

        if (isConnected) {
            // will be called when internet is back
            if (myDialog != null && myDialog.isAdded()) {
                myDialog.dismiss();

                //tv_check_connection.setVisibility(View.GONE);
            }
            //Network call
            networkAvailable();
            //Retrofit Network call
            spinnerData();

        } else {
            // will be called when internet is gone.
            myDialog.show(getSupportFragmentManager(), "my_dialog");
            tv_check_connection.setText(R.string.no_connection);
            tv_check_connection.setVisibility(View.VISIBLE);
            //connection.startAnimation(slideDownToUp);
            connection.setBackgroundColor(Color.parseColor("#2D2D2D"));
            tv_check_connection.setTextColor(Color.WHITE);

        }
    }

    public void unregisterNetworkChanges() {
        try {
            unregisterReceiver(networkReceiver);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        unregisterNetworkChanges();
        if (callDepartment != null && call != null) {
            callDepartment.cancel();
            callDepartment = null;
            call.cancel();
            call = null;
        }            
    }   
}

asif1261 avatar Feb 10 '20 08:02 asif1261

You simply should make the chart active and apply new data to the existing dataset. There's no need to recreate the chart:

APIlib.getInstance().setActiveAnyChartView(cartesian);
set1.data({NEW_DATA});

Shestac92 avatar Feb 12 '20 02:02 Shestac92

@Shestac92

.setActiveAnyChartView does not work with line charts. Error:

"setActiveAnyChartView (com.anychart.AnyChartView) in APIlib cannot be applied to (com.anychart.charts.Cartesian)"

AthanB avatar Mar 11 '20 17:03 AthanB