我有一个textWatcher来检测搜索栏中的文本更改。一旦发生文本更改,它将立即执行搜索操作。
例如,当我在搜索栏中输入“a”时,它会在for循环中运行itemData.name.toLowerCase().contains("a");
以搜索名称包含“a”的项目并在循环视图中显示
然后我继续输入“b”,它会运行
再次在for循环中itemData.name.toLowerCase().contains("ab");
搜索名称中包含“ab”的项目。
这是一个想法
//this will run when text change occur
for(){//for all item of itemlist
if(){//if item name contains the text
//store this item in itemlist
}
}
//update new itemlist to recycle view here
但是,性能非常慢。当我在搜索栏中输入时会有一些滞后。有人对此有解决方案吗?
答案 0 :(得分:0)
在自动完成期间,您希望每次按键都会过滤结果。相反,您希望在完成输入后触发搜索。如果用户没有完成键入他的关键字,我们将使用键入的每个键执行搜索请求。
要避免这么多请求并优化搜索体验,您可以使用TextWatcher
作为搜索字段EditText
。
private EditText searchText;
private TextView resultText;
private Timer timer;
private TextWatcher searchTextWatcher = new TextWatcher() {
@Override
public void afterTextChanged(Editable arg0) {
// user typed: start the timer
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
// do your actual work here
}
}, 600); // 600ms delay before the timer executes the „run“ method from TimerTask
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// nothing to do here
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// user is typing: reset already started timer (if existing)
if (timer != null) {
timer.cancel();
}
}
};
这段代码只是向您展示了解决问题的示例用例 关于如何猜测用户何时完成打字并想要的问题 没有提交按钮就开始搜索。我们使用600延迟 毫秒开始搜索。如果用户键入另一个字母 在搜索字段中,我们重置计时器并等待另外600毫秒。