Значение 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;
    }
}
Другие вопросы по тегам