0

I have done like docs here but Live data'a value is not changing. Please tell me what am i doing wrong. MainActivity

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

1 回答 1

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在构造函数中初始化,并将其标记为 final。

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

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

    public MutableLiveData<String> getCurrentName() {
        return mCurrentName;
    }
}
于 2018-04-12T05:11:49.527 回答