我正在尝试通过我的Activity和ViewModel学习MVVM模式。
现在,假设我的布局中有一个EditText。一旦我编辑了该字段,我便立即将该数据写入ViewModel,这将触发Observer,后者将触发Field的更新,并重新重复该循环。
例子:
public class TestFragment extends Fragment {
private FragmentTestBinding b;
private TestViewModel mViewModel;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
b = FragmentTestBinding.inflate(inflater, container, false);
return b.getRoot();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initViewModel();
initListener();
}
private void initViewModel() {
mViewModel = new ViewModelProvider(this).get(TestViewModel.class);
mViewModel.getText().observe(getViewLifecycleOwner(), this::onTextFieldChanged);
}
void onTextFieldChanged(String text) {
b.editText.setText(text);
}
void initListener() {
b.editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
mViewModel.setText(charSequence.toString());
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
}
还有ViewModelpublic class TestViewModel extends ViewModel {
private MutableLiveData<String> mEditText = new MutableLiveData<>();
LiveData<String> getText() {
return mEditText;
}
void setText(String text) {
mEditText.setValue(text);
}
}
我当前的解决方案是两个 boolean 标志overrideListener
和overrideViewModel
。每当我从ui设置文本时,我会将overrideViewModel设置为true并在观察器中将其重置。或者相反,如果该值是由viewModel设置的,则我检查文本更改监听器是否应该执行。这似乎是一种反模式。如此琐碎的事情不应该那么困难,而应该付出那么多的写作努力吗?
我希望我的问题很清楚,您可以解释我的错误:)
最佳答案
您可以像这样修改setText
方法,
void setText(String text) {
if (text != mEditText.getValue())
mEditText.setValue(text);
}
基本上,仅当新值与当前值不同时才设置它。
关于java - 避免MVVM模式中的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63755992/