W systemie Android, jak mogę to ListView
filtrować na podstawie danych wejściowych użytkownika, w przypadku gdy wyświetlane elementy są aktualizowane dynamicznie na podstawie TextView
wartości?
Szukam czegoś takiego:
-------------------------
| Text View |
-------------------------
| List item |
| List item |
| List item |
| List item |
| |
| |
| |
| |
-------------------------
Odpowiedzi:
Najpierw musisz utworzyć układ XML, który ma zarówno EditText, jak i ListView.
Spowoduje to poprawne ułożenie wszystkiego, z ładnym tekstem edycji nad ListView. Następnie utwórz ListActivity w normalny sposób, ale dodaj
setContentView()
wywołanie doonCreate()
metody, abyśmy używali naszego niedawno zadeklarowanego układu. Pamiętaj, że zidentyfikowaliśmyListView
specjalnie, zandroid:id="@android:id/list"
. Dzięki temuListActivity
wie, któregoListView
chcemy użyć w naszym zadeklarowanym układzie.Uruchomienie aplikacji powinno teraz pokazać poprzednią
ListView
, z ładnym pudełkiem powyżej. Aby zmusić to pole do zrobienia czegoś, musimy pobrać z niego dane wejściowe i uczynić z tego filtru listę. Chociaż wiele osób próbowało zrobić to ręcznie, większośćListView
Adapter
klas zawieraFilter
obiekt, którego można użyć do automatycznego filtrowania. Musimy tylko rury wejście odEditText
doFilter
. Okazuje się, że jest to całkiem proste. Aby przeprowadzić szybki test, dodaj tę linię doonCreate()
rozmowyZauważ, że będziesz musiał zapisać swoje
ListAdapter
w zmiennej, aby to działało - zapisałem mojeArrayAdapter<String>
z wcześniej w zmiennej o nazwie „adapter”.Następnym krokiem jest pobranie danych wejściowych z pliku
EditText
. To wymaga trochę namysłu. Możesz dodaćOnKeyListener()
do swojegoEditText
. Jednak ten odbiornik odbiera tylko niektóre kluczowe zdarzenia . Na przykład, jeśli użytkownik wpisze „wyw”, przewidywany tekst prawdopodobnie zaleci słowo „oko”. Dopóki użytkownik nie wybierze „wyw” lub „eye”,OnKeyListener
nie otrzymasz kluczowego zdarzenia. Niektórzy mogą preferować to rozwiązanie, ale uznałem to za frustrujące. Chciałem każdego kluczowego zdarzenia, więc miałem wybór, czy filtrować, czy nie. Rozwiązaniem jestTextWatcher
. Po prostu utwórz i dodaj aTextWatcher
doEditText
i przekażListAdapter
Filter
żądanie filtru za każdym razem, gdy zmieni się tekst. Pamiętaj, aby usunąćTextWatcher
inOnDestroy()
! Oto ostateczne rozwiązanie:źródło
uruchomienie programu spowoduje wymuszone zamknięcie.
Zamieniłem linię:
z
czy to może być problem? Do czego służy „@ + building_list”?
źródło
miałem problem z filtrowaniem, wyniki zostały przefiltrowane, ale nie zostały przywrócone !
więc przed filtrowaniem (rozpoczęciem aktywności) utworzyłem kopię zapasową listy ... (tylko kolejna lista, zawierająca te same dane)
podczas filtrowania filtr i listadapter są łączone z listą podstawową.
ale sam filtr używał danych z listy kopii zapasowych.
w moim przypadku zapewniło to, że lista była aktualizowana natychmiastowo i nawet po usunięciu wyszukiwanych haseł lista jest w każdym przypadku przywracana pomyślnie :)
i tak dzięki za to rozwiązanie.
źródło