android LiveData 的值没有改变

android LiveData's value is not changing

我已经像文档一样做了 here 但实时数据的值没有改变。请告诉我我做错了什么。 主要活动

public class 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;
}
}

这是因为,您的逻辑 returns 每次都是 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,并将其标记为 final。

public class NameViewModel extends ViewModel {
    private final MutableLiveData<String> mCurrentName;

    public NameViewModel() {
        mCurrentName = new MutableLiveData<>();
    }

    public MutableLiveData<String> getCurrentName() {
        return mCurrentName;
    }
}