2013-02-02 16 views
9

Ho un EditText per filtrare sotto di esso gli elementi nello ListView, che di solito contengono più di 1000 articoli. Il TextWatcher è:Come fare in modo che TextWatcher attenda per un po 'di tempo prima di fare qualche azione

txt_itemSearch.addTextChangedListener(new TextWatcher() { 

public void onTextChanged(CharSequence s, int start, int before, int count) { 
    fillItemList(); 
} 
public void afterTextChanged(Editable s) { 
} 

public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
} 
}); 

Il problema qui è che con ogni lettera digitata dall'utente, la lista è sempre aggiornata ed è questo aggiornamento elenco ripetuto che fa sì che l'interfaccia utente per essere lento.

Come è possibile fare in modo che TextWatcher attenda per 1-2 secondi e se non si verificano ulteriori input dopo 2 secondi, filtrare l'elenco. Qualche suggerimento ragazzi?

+1

* Eventuali suggerimenti ragazzi * - utilizzare il modo corretto di filtrare il 'ListView' utilizzando' getFilter dell'adattatore () 'metodo. – Luksprog

+0

OK, ma il filtro è un po 'complesso. Ho anche un paio di checkbox e altri parametri da filtrare, quindi la mia unica opzione è di farlo attraverso la query SQLite. – desidigitalnomad

risposta

16

Come posso rendere TextWatcher in attesa per 1-2 secondi e se non si immette più dopo 2 secondi, filtrare l'elenco.

Come ho già detto nel commento, è necessario esaminare il metodo getFilter() dell'adattatore. Poiché ciò potrebbe non essere adatto (come dici tu), cerca di implementare lo stesso meccanismo utilizzato dal filtro dell'adattatore per annullare tra gli input del filtro.

private Handler mHandler = new Handler(); 

public void afterTextChanged(Editable s) { 
     mHandler.removeCallbacks(mFilterTask); 
     mHandler.postDelayed(mFilterTask, 2000); 
} 

dove filterTask è:

Runnable mFilterTask = new Runnable() { 

    @Override 
    public void run() { 
      fillItemList(); 
    }  
} 
+1

Ha funzionato! Liscio come il latte ora. Grazie! – desidigitalnomad

+0

quando ho controllato LogCat ora, ho notato che sebbene l'elaborazione avvenga solo dopo 2 secondi, Runnable viene eseguito molte volte. Ad esempio, se digito "sof", fillItemList esegue 3 volte, per "s", "so" e "sof". Pensavo che Handler.removeCallbacks si sarebbe occupato di questo, ma non lo fece. – desidigitalnomad

+0

@rbH Ne sei sicuro? Stai digitando abbastanza velocemente? – Luksprog

0

Utilizzando RxBinding:?

RxTextView.textChanges(edittext) 
      .skipInitialValue() 
      .debounce(TIME_TO_WAIT, TimeUnit.MILLISECONDS) 
      .subscribe({ 
       //do the thing 
      }) 
}