Получить значения из ViewModel MutableLiveData и отобразить их в текстовых полях - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь освоить библиотеку архитектуры Android, и я пытался отображать тексты, полученные с помощью модификации, с помощью ViewModel, используя Mutable LiveData, в моей основной деятельности, но я не могу этого сделать, я был бы очень признателен за помощь.

Вот мой класс модели

public class User {


@SerializedName("name")
@Expose
private String name;
@SerializedName("email")
@Expose
private String email;
@SerializedName("phone")
@Expose
private String phone;

public User() {
}

public String getUserName() {
    return name;
}

public void setUserName(String name) {
    this.name = name;
}

public String getUserEmail() {
    return email;
}

public void setUserEmail(String email) {
    this.email = email;
}

public String getUserPhone() {
    return phone;
}

public void setUserPhone(String phone) {
    this.phone = phone;
}

}

Модель My View

public class UserViewModel extends AndroidViewModel {

  private NodeAuthService api;
  private SharedPreferences pref;

  private static MutableLiveData<List<User>> userDetails = new 
  MutableLiveData<>();


  private Call<List<User>> call;

  public UserViewModel(@NonNull Application application) {
    super(application);
    api = AuthRetrofitClient.getInstance().create(NodeAuthService.class);
  }
  private String email = pref.getString("email", "");

  public void loadUser(){
    call = api.getUser(email);
    call.enqueue(new Callback<List<User>>() {
        @Override
        public void onResponse(Call<List<User>> call, Response<List<User>> 
        response) {
            List<User> users =  response.body();
        }

        @Override
        public void onFailure(Call<List<User>> call, Throwable t) {
            Log.d("USER",t.getMessage());
        }
    });

  }

  public MutableLiveData<List<User>> getUserDetails(){
    return userDetails;
  }
}

Упрощенная версия моей MainActivity

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

    TextView navName = (TextView) findViewById(R.id.navigation_name);
    TextView navEmail = (TextView) findViewById(R.id.navigation_email);
}

Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

В вашей модели представления

public void loadUser(){
    call = api.getUser(email);
    call.enqueue(new Callback<List<User>>() {
        @Override
        public void onResponse(Call<List<User>> call, Response<List<User>> 
        response) {
            userDetails.postValue(response.body())
        }

        @Override
        public void onFailure(Call<List<User>> call, Throwable t) {
            Log.d("USER",t.getMessage());
        }
    });

  }

И в вашей деятельности наблюдайте изменения

yourVm.getUserDetails().observe(this, models -> {
                if (models != null) {
                    for(int = 0; i<models.size();i++){
                    /*you will get your list here now iterate through list and get 
                    your email_id here.*/
                   }
                 }
            });
0 голосов
/ 30 сентября 2019

вместо этого

List<User> users =  response.body();

используйте это

userDetails.postValue(response.body())

, также удалите статические данные перед liveata

внутри действия oncreate (), инициирующего ваш экземпляр viewModel. тогда viewModel.getUserDEtails().obsever(this, data-> // your stuff);

...