Android ViewModel tutorial




ViewModel:
As define in Android developer,


The ViewModel class is designed to store and manage UI-related data in a lifecycle conscious way. TheViewModel class allows data to survive configuration changes such as screen rotations.


Let us assume, we are showing EMPLOYEE data on screen,
To implement ViewModel,


Step 1:
Create a DataModel class,


public class User {


  public String empId;
  public String empName;
 
  public User(String empId, String empName) {


      this.empId = empId;
      this.empName = empName;
  
  }


  public String getEmpId() {
      return empId;
  }


  public void setEmpId(String empId) {
      this.empId = empId;
  }


  public String getEmpName() {
      return empName;
  }


  public void setEmpName(String empName) {
      this.empName = empName;
  }
}
Step 2:
Create a Repository, which will communicate between ViewModel and Data,


public class MainActivityRepo {


  private static MainActivityRepo instance;
  private ArrayList<User> dataset=new ArrayList<>();


  public static MainActivityRepo getInstance(){
      if(instance==null){
          instance=new MainActivityRepo();
      }
      return instance;
  }


  public MutableLiveData<List<User>> getUser(){
      setUserData();
      MutableLiveData<List<User>> data=new MutableLiveData<>();
      data.setValue(dataset);
      return data;
  }

  private void setUserData(){
      dataset.add(
              new User("emp001","John Doe","http://lorempixel.com/400/200/sports/1/"));
      dataset.add(
              new User("emp002","Ray Ban","http://lorempixel.com/400/200/sports/2/"));
      dataset.add(
              new User("emp003","Don Brown","http://lorempixel.com/400/200/sports/3/"));
  }

Step 3:
Create ViewModel,


public class MainActivityViewModel extends ViewModel {


  private MutableLiveData<List<User>> users;
  private MainActivityRepo mRepo;


  public void init(){
      if(users!=null){
          return;
      }
      mRepo=MainActivityRepo.getInstance();
      users=mRepo.getUser();
  }

  public LiveData<List<User>> getUser(){
      if(users==null){
          users=new MutableLiveData<List<User>>();
      }
      return users;
  }


}


Step 4:
Create a layout xml,

<RelativeLayout


      android:layout_width="match_parent"
      android:layout_height="match_parent"
      tools:context=".oneWayBinding.oneWayBinding.MainActivity">


  <TextView
           android:id="@+id/tv_empId"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
           />


</RelativeLayout>


Step 5:
Create a MainActivity class,


public class MainActivityJv extends AppCompatActivity {

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


      MainActivityViewModel model = ViewModelProviders.of(this)
                                      .get(MainActivityViewModel.class);
      model.init();
      model.getUser().observe(this, new Observer<List<User>>() {
          @Override
          public void onChanged(@Nullable List<User> users) {


              changeUI(users);


          }});


  }


  private void changeUI(List<User> user){

/** can get all user data from loop**/
//        for(int i=0;i<user.size();i++){
//         // Log.d("data:value",user.get(i).empId);
//
//        }


     TextView tv_empId=findViewById(R.id.tv_empId);
    tv_empId.setText(user.get(0).empId);

  }
}


Now rotate your screen , which will not effect on your activity and data.

Enjoy benefit the use of ViewModel,

Comments