有没有办法忽略输入的所有先前字符,这些字符会被传递到onQueryTextChange,直到输入最后一个字符?
例如,如果用户键入S Y M B O L,则每次输入字符时都会执行查询,因此执行6次查询。我想取消之前的5个查询,只运行最后一个查询。
"select * from table where name LIKE :searchText || '%' order by name limit 500"
我的表中有超过700,000个项目,因此屏幕需要几秒钟才能更新,我希望它能够立即更新。 如果用户键入速度慢,则表示没问题,但如果用户输入速度很快,则屏幕更新速度非常慢。
我正在使用RecyclerView并且查询返回LiveData。
我在这个特定列上有一个索引,所以这不是问题。
有解决方法吗?
答案 0 :(得分:1)
您可以使用每次用户输入时都会重置的timer
:
(假设,如果用户输入,5秒没有新文本会触发搜索,如果太长则可以调整秒数)
CountDownTimer timer = new CountDownTimer(5000, 1000) { //5000 for 5 seconds
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
//do your searching here
}
};
在onQueryTextChange
:
@Override
public boolean onQueryTextChange(String newText) {
timer.cancel();
timer.start();
return false;
}
答案 1 :(得分:1)
您可以使用onQueryTextSubmit()回调来传递最终键入的字符串
searchView.setOnQueryTextListener(
new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
Intent intent = new Intent(context, SearchResultActivity.class);
intent.putExtra(QUERY, query);// Perform search task with query string
context.startActivity(intent);
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;// triggered every time you type a character
}
}
);
希望有所帮助
答案 2 :(得分:1)