Using a SearchView
in my application.
Is there anyway in which I can make the call to onQueryTextChange() method delayed. Like, when user type a sequence o
This should help you, your class need to implement "SearchView.OnQueryTextListener" and "cntr" must be declarated in your class
This is already twinked for a regular user typing, if you want to wait more, just raise the "waitingTime".
The request should be inside the "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;
}
Delay call to onQueryTextChange() in SearchView.OnQueryTextListener with SearchView
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);
}
});
1) Create abstract 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) Set it like this:
searchView.setOnQueryTextListener(new DelayedOnQueryTextListener() {
@Override
public void onDelayerQueryTextChange(String query) {
// Handle query
}
});
You can use Kotlin coroutines like this. Declare the countdown job
private lateinit var textChangeCountDownJob: Job
And then onQueryTextChange:
override fun onQueryTextChange(newText: String): Boolean {
if(::textChangeCountDownJob.isInitialized)
textChangeCountDownJob.cancel()
textChangeCountDownJob = launch(UI) {
delay(800)
}
return false
}
To delay the call to your server, use the following code in your onQueryTextChange method, the variables mQueryString and mHandler must be class variables. also check 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;
}