我正在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()。有没有办法实现这个目标?任何帮助表示赞赏:)
答案 0 :(得分:1)
即使我遇到了类似的问题。我做的是,我把时间说1秒或2秒。所以每当用户在打字时花费这么多时间/停顿时,我都会调用过滤器。
参考 -
答案 1 :(得分:0)
每次文本更改时都会调用此方法,这意味着将每次时间添加到EditText中。
它是按设计工作的。
您可以使用View.OnFocusChangeListener仅在用户将焦点从EditText更改时通知您。 (当false
布尔值现在为{{1}}时,您必须进行过滤,以便“远离”编辑文本视图。
这将允许您只为每个“编辑会话”调用“一次”。
答案 2 :(得分: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"之后调用。
答案 3 :(得分: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
}
或;您可以在延迟1或2秒后对afterTextChanged
进行过滤..您可以使用Timer
和TimerTask
..