SearchView onQueryTextChange 忽略前面的字符,只使用最后输入的字符
SearchView onQueryTextChange ignore previous characters and only use last typed character
有没有办法忽略之前输入的所有字符,这些字符会传递给 onQueryTextChange 直到输入最后一个字符?
比如用户输入S Y M B O L,每输入一个字符就执行一次查询,所以执行6次查询。我想取消前5次查询,只取消运行最后一次
"select * from table where name LIKE :searchText || '%' order by name limit 500"
我的 table 里面有超过 700,000 个项目,所以屏幕更新大约需要几秒钟,我希望它能立即更新。
如果用户打字慢,没关系,但如果他们打字快,屏幕更新就会很慢。
我正在使用 RecyclerView 并查询 returns LiveData。
我在这个特定的列上有一个索引,所以这不是问题。
有解决办法吗?
您可以使用 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;
}
您可以使用 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
}
}
);
希望对您有所帮助
首先,你查询数据库的代码不应该在 UI 线程上,否则你可能会收到一条 ANR 消息,这不是一个好的 UX,相反你应该向用户显示某种进步 message/dialog/view.
有几种不同的方法可以执行此任务,可以通过 Jake Wharton 的库非常轻松地完成 RxBinding 您只需添加 .debounce(some_number_of_time_units, Unit.specified_time_unit)
如果您不想向您的代码库添加其他依赖项,您可以使用 Handler 和 post 延迟作为解决方案之一。
有没有办法忽略之前输入的所有字符,这些字符会传递给 onQueryTextChange 直到输入最后一个字符?
比如用户输入S Y M B O L,每输入一个字符就执行一次查询,所以执行6次查询。我想取消前5次查询,只取消运行最后一次
"select * from table where name LIKE :searchText || '%' order by name limit 500"
我的 table 里面有超过 700,000 个项目,所以屏幕更新大约需要几秒钟,我希望它能立即更新。 如果用户打字慢,没关系,但如果他们打字快,屏幕更新就会很慢。
我正在使用 RecyclerView 并查询 returns LiveData。
我在这个特定的列上有一个索引,所以这不是问题。
有解决办法吗?
您可以使用 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;
}
您可以使用 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
}
}
);
希望对您有所帮助
首先,你查询数据库的代码不应该在 UI 线程上,否则你可能会收到一条 ANR 消息,这不是一个好的 UX,相反你应该向用户显示某种进步 message/dialog/view.
有几种不同的方法可以执行此任务,可以通过 Jake Wharton 的库非常轻松地完成 RxBinding 您只需添加 .debounce(some_number_of_time_units, Unit.specified_time_unit)
如果您不想向您的代码库添加其他依赖项,您可以使用 Handler 和 post 延迟作为解决方案之一。