Rest Api data not Updating in real time
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 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 I still can't find where I did wrong!! Any insight will be very appreciated
@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;
}
}
}
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
.setActiveAnyChartView does not work with line charts. Error:
"setActiveAnyChartView (com.anychart.AnyChartView) in APIlib cannot be applied to (com.anychart.charts.Cartesian)"