在不使用暴露MutableLiveData的情况下进行LiveData双向数据绑定,可以使用以下解决方法:
public class CustomLiveData extends LiveData {
private T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
postValue(value);
}
}
public class MyViewModel extends ViewModel {
private CustomLiveData nameLiveData = new CustomLiveData<>();
public LiveData getNameLiveData() {
return nameLiveData;
}
public void setName(String name) {
nameLiveData.setValue(name);
}
}
public class MyActivity extends AppCompatActivity {
private MyViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 初始化ViewModel
viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
// 观察LiveData
viewModel.getNameLiveData().observe(this, new Observer() {
@Override
public void onChanged(@Nullable String name) {
// 更新UI
textView.setText(name);
}
});
// 更新数据
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModel.setName(editText.getText().toString());
}
});
}
}
通过以上方法,我们可以实现双向数据绑定,当ViewModel中的数据更新时,UI会自动更新,当用户在UI上进行数据更改时,ViewModel中的数据也会相应地更新。
上一篇:不使用包来请求外部存储权限的方式