Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Display and hide progress bar using MVVM pattern

I am working with MVVM pattern. I have just started it and i have done it successfully.

But I don't understand how to add progress bar for showing and hide as we normally do for API calls.

I am not using data binding. So how can i use progress bar for showing and hide it.

For Login

public class LoginRepository {

private DATAModel dataModel = new DATAModel();
private MutableLiveData<DATAModel> mutableLiveData = new MutableLiveData<>();
private Application application;

public LoginRepository(Application application) {
    this.application = application;
}

public MutableLiveData<DATAModel> getMutableLiveData(String username, String password) {

    APIRequest apiRequest = RetrofitRequest.getRetrofit().create(APIRequest.class);

    JsonLogin jsonLogin = new JsonLogin(Constants.DEVICE_TYPE, Functions.getDeviceId(application.getApplicationContext()), Constants.APP_VERSION, Constants.API_VERSION, Functions.getTimeStamp(), Functions.getDeviceModel(), Build.VERSION.RELEASE, username, password);

    Call<APIResponseLogin> call = apiRequest.getUsersDetails(jsonLogin);
    call.enqueue(new Callback<APIResponseLogin>() {
        @Override
        public void onResponse(Call<APIResponseLogin> call, Response<APIResponseLogin> response) {
            APIResponseLogin apiResponse = response.body();
            if (apiResponse != null && apiResponse.getStatuscode() == 0) {
                if (apiResponse.getDataModel() != null) {
                    dataModel = apiResponse.getDataModel();
                    mutableLiveData.setValue(dataModel);
                }

            } else if (apiResponse != null && apiResponse.getStatuscode() == 1) {

                Log.v("AAAAAAAAA", apiResponse.getStatusmessage());
            }
        }

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

            Log.v("ErrorResponse", t.getMessage() + " : " + call.request().toString());
        }
    });
    return mutableLiveData;
}

Activity Code

void loginCall() {
    loginViewModel.getUserDetails(editTextUsername.getText().toString().trim(), editTextPassword.getText().toString().trim()).observe(this, new Observer<DATAModel>() {
        @Override
        public void onChanged(@Nullable DATAModel dataModel) {
            if (dataModel != null) {
                Userdetails userdetails = dataModel.getUserdetails();
                List<ContactTypes> contactTypes = dataModel.getContactTypes();
                if (userdetails != null) {

                    MySharedPreferences.setCustomPreference(LoginActivity.this, Constants.SHAREDPREFERENCE_USERDETAILS, userdetails);
                    MySharedPreferences.setStringPreference(LoginActivity.this, Constants.SHAREDPREFERENCE_USER_ID, userdetails.getUserId());
                }

                if (contactTypes != null) {
                    MySharedPreferences.setCustomArrayList(LoginActivity.this, Constants.SHAREDPREFERENCE_CONTACTTYPES, contactTypes);
                }

                Intent i = new Intent(LoginActivity.this, MainActivity.class);
                startActivity(i);
                finish();
            }
        }
    });
}

Advanced help would be appreciated!


1 Answers

When you call api that time you have to take one live variable which shows your api is in loading mode or not and after success or failure you have to update that variable.

After observe that variable in your activity or fragment class and show or hide your progress.

public class LoginRepository {
    
      private DATAModel dataModel = new DATAModel();
      private MutableLiveData<DATAModel> mutableLiveData = new MutableLiveData<>();
      private Application application;
      private MutableLiveData<Boolean> progressbarObservable;
    
      public LoginRepository(Application application) {
          this.application = application;
      }

      public MutableLiveData<DATAModel> getMutableLiveData(String username, String password) {
         // add below line
         progressbarObservable.value = true
         APIRequest apiRequest = RetrofitRequest.getRetrofit().create(APIRequest.class);

    JsonLogin jsonLogin = new JsonLogin(Constants.DEVICE_TYPE, Functions.getDeviceId(application.getApplicationContext()), Constants.APP_VERSION, Constants.API_VERSION, Functions.getTimeStamp(), Functions.getDeviceModel(), Build.VERSION.RELEASE, username, password);

    Call<APIResponseLogin> call = apiRequest.getUsersDetails(jsonLogin);
    call.enqueue(new Callback<APIResponseLogin>() {
        @Override
        public void onResponse(Call<APIResponseLogin> call, Response<APIResponseLogin> response) {
            // add below line
            progressbarObservable.value = false
            APIResponseLogin apiResponse = response.body();
            if (apiResponse != null && apiResponse.getStatuscode() == 0) {
                if (apiResponse.getDataModel() != null) {
                    dataModel = apiResponse.getDataModel();
                    mutableLiveData.setValue(dataModel);
                }

            } else if (apiResponse != null && apiResponse.getStatuscode() == 1) {

                Log.v("AAAAAAAAA", apiResponse.getStatusmessage());
            }
        }

        @Override
        public void onFailure(Call<APIResponseLogin> call, Throwable t) {
            // add below line
            progressbarObservable.value = false
            Log.v("ErrorResponse", t.getMessage() + " : " + call.request().toString());
        }
    });
    return mutableLiveData;
    }
    }

Now, observe above variable in activity or fragment and based on that value hide or show your progress bar

    public class LoginActivity extends AppCompatActivity {
      ...
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        ...
        
        observeLogin();
      }

       @Override
       public void onClick(View view) 
       { 
         switch (view.getId()) { 
            case R.id.button_login: 
            // Do something 
            loginCall();
          } 
       } 
      
      private void observeLogin() {
        loginViewModel.progressbarObservable().observe(this, new  Observer<Boolean>() {
          @Override
          public void onChanged(final Boolean progressObserve) {
            if(progressObserve){
               show your progress
            }
            else {
               hide your progress
            }
          }
        });
      }

void loginCall() {
    loginViewModel.getUserDetails(editTextUsername.getText().toString().trim(), editTextPassword.getText().toString().trim()).observe(this, new Observer<DATAModel>() {
        @Override
        public void onChanged(@Nullable DATAModel dataModel) {
            if (dataModel != null) {
                Userdetails userdetails = dataModel.getUserdetails();
                List<ContactTypes> contactTypes = dataModel.getContactTypes();
                if (userdetails != null) {

                    MySharedPreferences.setCustomPreference(LoginActivity.this, Constants.SHAREDPREFERENCE_USERDETAILS, userdetails);
                    MySharedPreferences.setStringPreference(LoginActivity.this, Constants.SHAREDPREFERENCE_USER_ID, userdetails.getUserId());
                }

                if (contactTypes != null) {
                    MySharedPreferences.setCustomArrayList(LoginActivity.this, Constants.SHAREDPREFERENCE_CONTACTTYPES, contactTypes);
                }

                Intent i = new Intent(LoginActivity.this, MainActivity.class);
                startActivity(i);
                finish();
            }
        }
    });
}
      
    }
like image 141
Shweta Chauhan Avatar answered Jun 16 '26 15:06

Shweta Chauhan



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!