2015-05-05 7 views
9

Utilizzo di SearchView nella mia applicazione.Ritarda la chiamata a onQueryTextChange() in SearchView.OnQueryTextListener con SearchView

C'è comunque un modo in cui posso ritardare la chiamata al metodo onQueryTextChange(). Ad esempio, quando l'utente digita una sequenza di caratteri, deve attendere prima di chiamare questo metodo.

Questa attesa dovrebbe non dipende dal numero di caratteri digitati, ma è necessaria una piccola pausa prima che il metodo venga colpito.

Voglio mettere in pausa perché, mentre l'utente digita nella vista di ricerca, una richiesta con la stringa verrà inviata al server per richiedere i dati corrispondenti, quindi compilerò il mio ListView secondo i suggerimenti.

Informazioni attività (se richieste):
Dimensioni SearchView.OnQueryTextListener.

MenuItem searchItem = menu.findItem(R.id.action_search); 
    SearchView searchView = (SearchView)MenuItemCompat.getActionView(searchItem); 
    searchView.setOnQueryTextListener(this); 
+0

no, perché avete bisogno di questo? – pskink

+0

È possibile utilizzare un TimerTask per ritardare il filtraggio dell'elenco. Inserisci il codice del filtro all'interno del timer. Tuttavia non raccomanderei di ritardare la ricerca. – Skynet

+0

@pskink Per recuperare i dati dal server mentre l'utente digita in SearchView. La richiesta non deve essere fatta ogni volta che un carattere viene digitato, piuttosto dovrebbe esserci una pausa. –

risposta

8

di ritardare la chiamata al server, utilizzare il seguente codice nel metodo onQueryTextChange, le variabili mQueryString e mHandler devono essere variabili di classe.

@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; 
} 
+0

Questo ha risolto il problema. Grazie ! –

+0

grazie, funziona perfettamente! – gayavat

+0

Grazie che era grata. – Erik

1

Ritardo chiamata a onQueryTextChange() in SearchView.OnQueryTextListener con 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); 
      } 
     }); 
2

Questo dovrebbe aiutare, la classe ha bisogno di attuare "SearchView.OnQueryTextListener" e "Cntr" deve essere declarated nella vostra classe

Questo è già stato twinkato per un utente normale che digita, se si desidera attendere di più, basta aumentare il "waitingtime".

La richiesta deve essere all'interno della "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; 
} 
Problemi correlati