Значение Android LiveData не меняется
Я сделал как документы здесь, но значение Live data'а не меняется. Пожалуйста, скажите мне, что я делаю не так. Основная деятельность
открытый класс MainActivity расширяет AppCompatActivity {
private NameViewModel mModel;
private ActivityMainBinding binding;
int index = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.button.setOnClickListener((v) -> {
mModel.getCurrentName().setValue("Test");
});
mModel = ViewModelProviders.of(this).get(NameViewModel.class);
final Observer<String> nameObserver = (text) -> {
binding.textInputLayout.getEditText().setText(text);
};
mModel.getCurrentName().observe(this, nameObserver);
}
}
NameViewModel.java
public class NameViewModel extends ViewModel {
private MutableLiveData<String> mCurrentName;
public MutableLiveData<String> getCurrentName() {
if (mCurrentName == null) {
return new MutableLiveData<>();
}
return mCurrentName;
}
}
1 ответ
Решение
Это потому, что ваша логика возвращает новый экземпляр mCurrentName
каждый раз. Пожалуйста, используйте следующую функцию.
public class NameViewModel extends ViewModel {
private MutableLiveData<String> mCurrentName;
public MutableLiveData<String> getCurrentName() {
// Ensure there is only 1 instance of mCurrentName
if (mCurrentName == null) {
mCurrentName = new MutableLiveData<>();
}
return mCurrentName;
}
}
Гораздо лучше и безопаснее (уменьшить вероятность совершения такой ошибки) - инициализировать mCurrentName
в конструкторе, и отметьте его как окончательный.
public class NameViewModel extends ViewModel {
private final MutableLiveData<String> mCurrentName;
public NameViewModel() {
mCurrentName = new MutableLiveData<>();
}
public MutableLiveData<String> getCurrentName() {
return mCurrentName;
}
}