Значение Android LiveData не меняется

Я сделал, как документы здесь, но значение Live data'a не меняется. Пожалуйста, скажите мне, что я делаю неправильно. Основная деятельность

открытый класс 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;
}
}

person nAkhmedov    schedule 12.04.2018    source источник


Ответы (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;
    }
}
person Cheok Yan Cheng    schedule 12.04.2018