2013-02-02 6 views
9

Mam EditText, aby filtrować elementy znajdujące się pod ListView, które zwykle mogą zawierać więcej niż 1000 elementów. TextWatcher jest:Jak sprawić, że TextWatcher będzie czekać przez jakiś czas, zanim wykona jakąś czynność?

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) { 
} 
}); 

Problem jest to, że z każdej litery wpisane przez użytkownika, lista jest weryfikowana i jest to powtarzane aktualizacji listy, która powoduje, że interfejs będzie powolny.

Jak mogę odczekać 1-2 sekundy, aby TextWatcher i jeśli po 2 sekundach nie nastąpi więcej danych wejściowych, odfiltruj listę. Jakieś sugestie facetów?

+1

* Wszelkie sugestie facetów * - użycie właściwego sposobu filtrowania 'ListView' użyciem' metodę getFilter adaptera () 'metoda. – Luksprog

+0

OK, ale filtrowanie jest trochę skomplikowane. Mam również kilka Checkboxów i inne parametry do filtrowania, więc moją jedyną opcją jest pobranie ich za pomocą zapytania SQLite. – desidigitalnomad

Odpowiedz

16

Jak mogę sprawić, że textWatcher czekać przez 1-2 sekund i jeśli nie więcej wejściowy dzieje się po 2 sekundy, a następnie filtrować listę.

Tak jak już wspomniałem w komentarzu, należy przyjrzeć się metodzie adaptera w postaci getFilter(). Ponieważ może to nie być odpowiednie (jak mówisz) spróbuj zaimplementować ten sam mechanizm, którego filtr adaptera używa do anulowania pomiędzy wejściami filtru.

private Handler mHandler = new Handler(); 

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

gdzie filterTask jest:

Runnable mFilterTask = new Runnable() { 

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

To zadziałało! Teraz gładki jak mleko. Dzięki! – desidigitalnomad

+0

kiedy teraz sprawdziłem LogCat, zauważyłem, że chociaż przetwarzanie odbywa się dopiero po 2 sekundach, Runnable działa wiele razy. Na przykład, Jeśli wpisz "sof", fillItemList działa 3 razy - dla "s", "tak" i "sof". Myślałem, że Handler.removeCallbacks zajmie się tym, ale tak się nie stało. – desidigitalnomad

+0

@rbH Czy jesteś tego pewien? Czy piszesz wystarczająco szybko? – Luksprog

0

Korzystanie RxBinding:

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