2

我在 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() 一次。有没有办法做到这一点?任何帮助表示赞赏:)

4

4 回答 4

1

即使我遇到了类似的问题。我所做的是,我把时间说为 1 秒或 2 秒。因此,每当用户花费这么多时间/暂停输入时,我都会调用过滤器。

参考——

https://stackoverflow.com/a/12143050/1320616

于 2015-12-24T06:09:32.367 回答
0

根据您对第一个答案的评论,应该有一个单独的按钮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
}

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

于 2015-12-24T06:17:52.517 回答
0

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

它是按设计工作的。

您可以使用View.OnFocusChangeListener仅在用户将焦点从 EditText 移开时通知您。(您必须在hasFocus布尔值为 now时进行过滤false,以“远离”edittext 视图。

这将允许您在每个“编辑会话”中只被调用“一次”。

于 2015-12-24T05:45:33.030 回答
0

将代码移动到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”之后调用。

于 2015-12-24T05:49:55.290 回答