使用 SearchView 在 SearchView.OnQueryTextListener 中延迟调用 onQueryTextChange()
Delay call to onQueryTextChange() in SearchView.OnQueryTextListener with SearchView
在我的应用程序中使用 SearchView
。
我是否可以延迟调用 onQueryTextChange() 方法。比如,当用户键入一系列字符时,他必须等待此方法被调用。
此等待应该不取决于键入的字符数,但在命中方法之前需要稍作停顿。
我想暂停一下,因为当用户在搜索视图中键入内容时,将向服务器发出带有字符串的请求以请求匹配的数据,然后我将根据建议填充我的 ListView。
Activity 信息(如果需要):
实现 SearchView.OnQueryTextListener
.
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView)MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextListener(this);
要延迟对服务器的调用,请在 onQueryTextChange 方法中使用以下代码,变量 mQueryString 和 mHandler 必须是 class 变量。
还要检查 mHandler!=null
@Override
public boolean onQueryTextChange(String searchTerm) {
mQueryString = searchTerm;
mHandler.removeCallbacksAndMessages(null);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
//Put your call to the server here (with mQueryString)
}
}, 300);
return true;
}
使用 SearchView
在 SearchView.OnQueryTextListener 中延迟调用 onQueryTextChange()
private long delay = 2000;
private long editTextLastWord = 0;
privaste SearchView searchView;
Handler handler = new Handler();
private Runnable runnable = new Runnable() {
public void run() {
if (System.currentTimeMillis() > (editTextLastWord + delay - 500)) {
perFormTask();
}
}
};
searchView=(SearchView) findViewById(R.id.searchView);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
if (s.length() > 2) {
editTextLastWord = System.currentTimeMillis();
handler.postDelayed(runnable, delay);
} else {
}
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
handler.removeCallbacks(runnable);
}
});
这应该对您有所帮助,您的 class 需要实施 "SearchView.OnQueryTextListener" 并且 "cntr" 必须在您的 class
中声明
这已经为普通用户输入提供了 twinked,如果您想等待更多,只需提高 "waitingTime"。
请求应该在 "onFinish"
内
private int waitingTime = 200;
private CountDownTimer cntr;
@Override
public boolean onQueryTextChange(String newText) {
if(cntr != null){
cntr.cancel();
}
cntr = new CountDownTimer(waitingTime, 500) {
public void onTick(long millisUntilFinished) {
Log.d("TIME","seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
Log.d("FINISHED","DONE");
}
};
cntr.start();
return false;
}
您可以像这样使用 Kotlin 协程。
宣布倒计时工作
private lateinit var textChangeCountDownJob: Job
然后 onQueryTextChange:
override fun onQueryTextChange(newText: String): Boolean {
if(::textChangeCountDownJob.isInitialized)
textChangeCountDownJob.cancel()
textChangeCountDownJob = launch(UI) {
delay(800)
}
return false
}
1) 创建摘要 class:
public abstract class DelayedOnQueryTextListener implements SearchView.OnQueryTextListener {
private Handler handler = new Handler();
private Runnable runnable;
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
@Override
public boolean onQueryTextChange(String s) {
handler.removeCallbacks(runnable);
runnable = () -> onDelayerQueryTextChange(s);
handler.postDelayed(runnable, 400);
return true;
}
public abstract void onDelayerQueryTextChange(String query);
}
2)这样设置:
searchView.setOnQueryTextListener(new DelayedOnQueryTextListener() {
@Override
public void onDelayerQueryTextChange(String query) {
// Handle query
}
});
在我的应用程序中使用 SearchView
。
我是否可以延迟调用 onQueryTextChange() 方法。比如,当用户键入一系列字符时,他必须等待此方法被调用。
此等待应该不取决于键入的字符数,但在命中方法之前需要稍作停顿。
我想暂停一下,因为当用户在搜索视图中键入内容时,将向服务器发出带有字符串的请求以请求匹配的数据,然后我将根据建议填充我的 ListView。
Activity 信息(如果需要):
实现 SearchView.OnQueryTextListener
.
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView)MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextListener(this);
要延迟对服务器的调用,请在 onQueryTextChange 方法中使用以下代码,变量 mQueryString 和 mHandler 必须是 class 变量。 还要检查 mHandler!=null
@Override
public boolean onQueryTextChange(String searchTerm) {
mQueryString = searchTerm;
mHandler.removeCallbacksAndMessages(null);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
//Put your call to the server here (with mQueryString)
}
}, 300);
return true;
}
使用 SearchView
在 SearchView.OnQueryTextListener 中延迟调用 onQueryTextChange()private long delay = 2000;
private long editTextLastWord = 0;
privaste SearchView searchView;
Handler handler = new Handler();
private Runnable runnable = new Runnable() {
public void run() {
if (System.currentTimeMillis() > (editTextLastWord + delay - 500)) {
perFormTask();
}
}
};
searchView=(SearchView) findViewById(R.id.searchView);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
if (s.length() > 2) {
editTextLastWord = System.currentTimeMillis();
handler.postDelayed(runnable, delay);
} else {
}
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
handler.removeCallbacks(runnable);
}
});
这应该对您有所帮助,您的 class 需要实施 "SearchView.OnQueryTextListener" 并且 "cntr" 必须在您的 class
中声明这已经为普通用户输入提供了 twinked,如果您想等待更多,只需提高 "waitingTime"。
请求应该在 "onFinish"
内 private int waitingTime = 200;
private CountDownTimer cntr;
@Override
public boolean onQueryTextChange(String newText) {
if(cntr != null){
cntr.cancel();
}
cntr = new CountDownTimer(waitingTime, 500) {
public void onTick(long millisUntilFinished) {
Log.d("TIME","seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
Log.d("FINISHED","DONE");
}
};
cntr.start();
return false;
}
您可以像这样使用 Kotlin 协程。 宣布倒计时工作
private lateinit var textChangeCountDownJob: Job
然后 onQueryTextChange:
override fun onQueryTextChange(newText: String): Boolean {
if(::textChangeCountDownJob.isInitialized)
textChangeCountDownJob.cancel()
textChangeCountDownJob = launch(UI) {
delay(800)
}
return false
}
1) 创建摘要 class:
public abstract class DelayedOnQueryTextListener implements SearchView.OnQueryTextListener {
private Handler handler = new Handler();
private Runnable runnable;
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
@Override
public boolean onQueryTextChange(String s) {
handler.removeCallbacks(runnable);
runnable = () -> onDelayerQueryTextChange(s);
handler.postDelayed(runnable, 400);
return true;
}
public abstract void onDelayerQueryTextChange(String query);
}
2)这样设置:
searchView.setOnQueryTextListener(new DelayedOnQueryTextListener() {
@Override
public void onDelayerQueryTextChange(String query) {
// Handle query
}
});