onTextChanged(CharSequence s, int start, int before, int count) 被多次调用

onTextChanged(CharSequence s, int start, int before, int count) is called multiple times

我正在 EditText 上实现 addTextChangedListener。

 tagNameEditText.addTextChangedListener(new TextWatcher() {

                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    last_text_edit = System.currentTimeMillis();
                    searchStringFilter = s.toString();
                    h.removeCallbacks(input_finish_checker);
                    already_queried = false;
                    h.postDelayed(input_finish_checker, idleTime);
                    // getFilter().filter(s.toString());
                }

                @Override
                public void afterTextChanged(Editable s) {
                }
            });

问题是每当 EditText 中的文本发生变化时,它都会被多次调用。但我只想在文本更改后调用 OnTextChanged() 一次。有什么办法可以做到这一点?感谢您的帮助:)

每次文本更改时都会调用此方法,这意味着 EACH 次将新字母添加到 EditText。

这是设计使然。

您可以使用 View.OnFocusChangeListener 仅在用户将焦点从 EditText 移开时通知您。 (当 hasFocus 布尔值现在为 false 时,您必须进行过滤才能获得 'moving away from' edittext 视图。

这将允许您在每个 "Edit Session".

中只被调用 'once'

将您的代码移至 afterTextChanged 方法

@Override
public void afterTextChanged(Editable s) {
    last_text_edit = System.currentTimeMillis();
    searchStringFilter = tagNameEditText.getText().toString();
    h.removeCallbacks(input_finish_checker);
    already_queried = false;
    h.postDelayed(input_finish_checker, idleTime);
}

onTextChanged :这意味着当你开始打字时,就像你想写 "sports" 然后这将调用每个字符,就像它会在你按 "s" 然后再按 "p" 然后 "o" 等等...

afterTextChanged : 这会在你停止输入时调用,它会在你完成 "sport".

后调用

我也遇到过类似的问题。我所做的是,我把时间说成 1 秒或 2 秒。因此,每当用户输入这么多 time/pause 时,我都会调用过滤器。

参考-

根据您对第一个答案的评论,search 应该有一个单独的按钮;如果您不想过滤子字符串...

我建议您应该对大小为 >n 的字符串调用过滤.. 比如

@Override
public void onTextChanged(CharSequence s, int start, int before, 
    int count) {
    .
    .
    if size of s is > n:
        cancel prev filtering
        do fresh filtering on s
}

或;您可以在延迟 1 或 2 秒后对 afterTextChanged 进行过滤。您可以使用 TimerTimerTask..