java - 避免MVVM模式中的循环

标签 java android mvvm viewmodel

我正在尝试通过我的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) {

            }
        });
    }
}
还有ViewModel
public class TestViewModel extends ViewModel {
 private MutableLiveData<String> mEditText = new MutableLiveData<>();

    LiveData<String> getText() {
        return mEditText;
    }

    void setText(String text) {
        mEditText.setValue(text);
    }
}
我当前的解决方案是两个 boolean 标志overrideListeneroverrideViewModel。每当我从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/

相关文章:

c# - 如果方法抛出异常,则更改文本 block 的前景

java - 齐柏林飞艇 : How to create DataFrame from within custom interpreter?

java - 替换@SequenceGenerator,因为它已被弃用

php - 如何将 Android 应用程序连接到外部托管服务器上正在运行的 MySQL 数据库

java - 最近迁移到 androidx,我发现 alertdialog 的布局问题

android - 未知属性 onItemSelected/onCheckedChanged

c# - MVVM Light 和 WPF - 将一个窗口的多个实例绑定(bind)到一个 ViewModel

java - 使用 Okta 验证其余端点和 UI

java - 如何对从第一个字符开始的字符串数组进行排序?

android - 使用下载管理器下载文件