2012-02-23 13 views
5

Chcę odfiltrować mój listView przy użyciu pudełka EditText i korzystając z funkcji adaptera getFilter(). Działa dobrze, dopóki nie wstawię spacji w polu tekstowym.Filtr dla Androida ListView - Przestrzeń znaków

Edit: To SimpleAdapter nie ArrayAdapter

Jeśli moja lista zawiera te słowa: { "Apple", "Banan", "Red Apple"} Gdybym typu "jabłko" zwróci wszystkie elementy zawierające słowo "jabłko" (Apple i czerwone jabłko). Jeśli napiszę "jabłko", to nie zwróci nic.

Wszelkie pomysły? Oto kod:

searchBox = (EditText) findViewById(R.id.searchBox); 

searchBox.addTextChangedListener(filterTextWatcher); 

i

private TextWatcher filterTextWatcher = new TextWatcher() { 

public void onTextChanged(CharSequence s, int start, int before, int count) { 
    // TODO Auto-generated method stub   
} 

public void beforeTextChanged(CharSequence s, int start, int count, 
      int after) { 
    // TODO Auto-generated method stub   
} 

public void afterTextChanged(Editable s) { 
    // TODO Auto-generated method stub 
    myAdapter.getFilter().filter(s.toString()); 
} 
}; 
+0

Czy kiedykolwiek wymyśliłeś ten jeden? –

+0

Nie przepraszam. Myślę, że rozwiązaniem może być stworzenie własnego adaptera opartego na ArrayAdapter, ale nie próbowałem (przestałem pracować nad tym projektem). – Chris911

+0

@CaptainProg Jakiego rodzaju odpowiedzi szukasz? Z pierwotnym pytaniem postawionym przy użyciu 'trim()' jest najlepszą odpowiedzią. – Sam

Odpowiedz

2

Jeśli funkcja filtrowania z SimpleAdapter nie spełnia wymagań filtrowania, trzeba przesłonić Prosty adapter i implementuj własne wymagania dotyczące filtrowania.

To wymaga dużej ilości kodu, ponieważ filtr w SimpleAdapter używa wielu obiektów prywatnych, które trzeba będzie replikować. To samo dotyczyło ArrayAdapter

Na szczęście inna osoba (@ uʍop ǝpısdn) przystąpiła już do procesu, napisała kod i udostępniła go społeczności.

Link można znaleźć pod adresem blog here, w tym sposób korzystania z przykładów oraz kod w wersji here.

Pozdrawiam.

+0

Myślę, że to jedyne prawidłowe rozwiązanie. Minęło trochę czasu, odkąd zadałem to pytanie i nie pracuję już nad tym projektem, ale spróbuję zatwierdzić. Dzięki. – Chris911

+0

Dokładnie. Opisany problem powstaje z powodu tej linii: 'String [] words = str.split (" ");' in ** SimpleAdapter.SimpleFilter ** class, która po prostu pomija spacje z początkowych ciągów znaków, dzieląc je na słowa. –

+0

@Luis Mam podobny problem i wysłałem pytanie http: // stackoverflow.com/questions/39573432/get-filter-does-not-work-for-space-in-android Mam nadzieję, że możesz pomóc. – AndroidNewBee

2

Spróbuj użyć tego:

myAdapter.getFilter().filter(s.toString().trim()); 
+0

Działa to częściowo tylko dlatego, że usuwa spacje, ale załóżmy, że wpisuję "Red Ap", zmieni to na "RedAp" i nie ma w moim wyborze słowa zawierającego "RedAp". Zasadniczo rozwiązuje to problem, jeśli wstawię pojedynczy "" przed lub po słowie, ale nie da to pożądanego rezultatu. – Chris911

+2

@ Chris911: to nie będzie faktycznie.trimming oznacza, po prostu usuwa spacje przed i po tekst zaczyna się i zatrzymuje odpowiednio. Tak, jeśli wpiszesz "jabłko", to będzie przyciąć go do "jabłko", ale jeśli wpiszesz " czerwony ap ", zajmie to jak to. – Hiral

+0

Dzięki za wyjaśnienie, Hiral, ale to wciąż nie rozwiązuje problemu. Zaczynam myśleć, że jedynym sposobem na zrobienie tego jest zaimplementowanie mojego własnego adaptera z moim własnym filtrem. – Chris911

Powiązane problemy