Filtrare una ListView in Android
Oggi vediamo come impostare dei filtri in una ListView in Android.
In sostanza, avendo una ListView caricata (do per scontato che sappiate come caricarla), filtreremo la lista in base a quello che scriviamo in una EditText (una casella di testo).
Partendo dal layout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical" ><EditText
android:id="@+id/txt_search"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/cerca"
android:maxLines="1" /><ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content" /></LinearLayout>
Così facendo abbiamo impostato una EditText a inizio layout, che di default non è selezionata.
Passando al codice della Activity / Fragment (il secondo nel mio caso):
public class FragmentEntries extends ListFragment {
private ListView lv = null;
private EditText txtSearch = null;
private ListAdapter adapter = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.layout_fragment, container, false);
return view;
}@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
lv = getListView();
txtSearch = (EditText) getView().findViewById(R.id.txt_search);
txtSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
((SimpleAdapter) adapter).getFilter().filter(s);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
// RIEMPIMENTO LISTA
}}
Ometto il codice per riempire la ListView, visto che allo scopo non serve e visto che ognuno la riempie in maniera diversa anche a seconda della provenienza dei dati.
Sulla nostra EditText abbiamo impostato un listener addTextChangedListener, che richiede un oggetto TextWatcher.
Poi abbiamo implementato i metodi richiesti dall'interfaccia TextWatcher.
Di questi a noi serve solo onTextChanged; qui dentro richiamiamo il nostro adapter e impostiamo con getFilter, che ritorna la lista filtrata a quanto scritto.
La velocità di esecuzione del filtro dipende ovviamente anche da quanto è lunga lista.
Ciao!
java android listview simpleadapter textwatcher getfilter ontextchanged addtextchangedlistener editt
Commentami!