Home / Programmazione / Java Android / Filtrare una ListView in Android
Mattepuffo

Filtrare una ListView in Android

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!