Domanda Come fare in modo che TextWatcher aspetti un po 'di tempo prima di agire


ho un EditText per filtrare gli elementi nel ListView ud B B B Bud B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B Il TextWatcher è:

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 si sta aggiornando ed è questo aggiornamento di lista ripetuto che fa sì che l'interfaccia utente sia lenta.

Come posso fare il TextWatcher attendere 1-2 secondi e se non si verificano ulteriori input dopo 2 secondi, filtrare l'elenco. Qualche suggerimento ragazzi?


10
2018-02-02 09:48


origine


risposte:


Come posso rendere TextWatcher in attesa per 1-2 secondi e se non c'è più input   ududud Bud Bud B B B Budud B B B Budud B B Budud B B Bud B B Bud Bud B B Budud B Bud Bud B B Budud B B B

Come ho già detto nel commento, dovresti esaminare l'uso di getFilter() metodo 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();
     }       
}

16
2018-02-02 10:34



utilizzando RxBinding :

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

0
2018-02-05 07:24