avoid循环

mzmfm0qo  于 2021-07-04  发布在  Java
关注(0)|答案(1)|浏览(308)

我正在尝试用我的活动和viewmodel学习mvvm模式。
现在,假设我的布局中有一个edittext。一旦我编辑了这个字段,我会立即将数据写入viewmodel,它会触发观测者,而观测者会触发字段的更新,并再次重复这个循环。
例子:

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);
    }
}

我当前的解决方案是两个布尔标志 overrideListener 以及 overrideViewModel . 每当我从ui设置文本时,我都会将overrideviewmodel设置为true,并在observer中重置它。或者反过来,如果值是由viewmodel设置的,我在文本更改侦听器中检查它是否应该执行。
这似乎是反模式。如此琐碎的事情不应该如此困难,那么多的写作努力应该吗?
我希望我的问题足够清楚,你能解释我的错误:)

enyaitl3

enyaitl31#

您可以修改 setText 像这样的方法,

void setText(String text) {
    if (text != mEditText.getValue())
        mEditText.setValue(text);
}

基本上,只有当新值与当前值不同时才设置新值。

相关问题