device-2012-05-19-020654

Android 4.0.3 ListView

Analisi di un semplice programma in Java per Android, scritto con Eclipse 3.7.2.

Per prima cosa creo un nuovo file XML da mettere in res/layout/ che chiamo list_item.xml, e che è un file che descrive il layout della singola riga che andrà a formare la lista: con la IDE è facile creare una nuova TextView

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</TextView>

sempre con l’ aiuto della IDE si può modificare il layout a piacimento.
Inoltre preparo i dati da rappresentare nella lista: in res/values/strings.xml aggiungo un’ array di stringhe del tipo:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">ProvaListView</string>

    <string-array name="list_countries">
        <item>Afghanistan</item>
        <item>Albania</item>
        <item>Algeria</item>
        <item>Andorra</item>
        <item>Angola</item>
        .......
    </string-array>

</resources>

Notare l’ attributo name=”list_countries” di string-array: sarà usato per richiamare i dati in seguito.

Poi modifico il file della Activity del programma: invece di usare questa classe, userò la sua sottoclasse ListActivity

public class ProvaListViewActivity extends ListActivity { ..... }

La classe ListActivity ha alcuni metodi specializzati per creare la lista tramite degli Adapter: questi sono un tramite fra i dati e la vista.
Quindi cancello la riga che imposta la vista con un contenuto “statico”

setContentView(R.layout.main);

e la sostituisco con il metodo public void setListAdapter (ListAdapter adapter) della classe ListActivity; il suo argomento è un oggetto ListAdapter che ha diverse sottoclassi.
In questo esempio userò la sottoclasse ArrayAdapter dichiarando T come String, cioè un ArrayAdapter di stringhe.
La classe ArrayAdapter ha diversi costruttori: userò public ArrayAdapter (Context context, int textViewResourceId, T[] objects) e perciò devo reperire l’ array di oggetti di tipo T = String.
Il tutto è riportato nel seguente snippet:

String[] list_countries = getResources().getStringArray(R.array.list_countries); 
setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, list_countries));

con la prima riga richiamo i dati da res/values/strings.xml con l’ attributo list_countries;
con la seconda creo in modo “anonimo” l’ ArrayAdapter indicando il contesto, il template “list_item”, e i dati.

A questo punto, i dati sono “collegati” all’ adapter, pronti per essere visualizzati.
Rimane da impostare la ListView.

Essa è “contenuta” nella ListActivity, e la prendo con il comando ListView lv = getListView();; ora posso impostare varie opzioni. Ad esempio imposto lv.setTextFilterEnabled(true); (che filtra gli elementi in base all’ input utente) e imposto un callback per i click sui singoli elementi: lv.setOnItemClickListener(listener); in cui “listener” è una interfaccia, con un metodo astratto “onItemClick” che rappresenta la funzione di callback vera e propria.
La definizione di onItemClick è abstract void onItemClick(AdapterView parent, View view, int position, long id), in cui AdapterView (con type generics) è l’ Adapter un cui elemento viene cliccato (in questo caso è una ListView, discendente di AdapterView), view è la vista cliccata nell’ AdapterView (il valore è fornito dall’ Adapter), position e id sono la posizione e l’ id della vista cliccata.
Un esempio di tutto ciò è:

OnItemClickListener listener = new OnItemClickListener() {
        	@Override
        	public void onItemClick(AdapterView<?> parent, View view, int position,
        			long id) {
        		TextView tv = (TextView) view;
        		Toast.makeText(getApplicationContext(), tv.getText(), Toast.LENGTH_LONG).show();
        	}
		};
ListView lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(listener);

in cui il callback visualizza semplicemente un Toast con il testo cliccato (utilizzo un type casting da View a TextView).

Il risultato complessivo è:

public class ProvaListViewActivity extends ListActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /** Questo metodo aggiunge alla ListActivity un ListAdapter.
         *  Uso una sua sottoclasse: ArrayAdapter di tipo String.
         *  L' Adapter ha vari costruttori.
         *  Qui uso quello che collega al Context "this" una risorsa,
         *  prende poi una TextView R.layout.list_item,
         *  e infine prende l' array di elementi. */
        String[] list_countries = getResources().getStringArray(R.array.list_countries); 
        setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, list_countries));
        OnItemClickListener listener = new OnItemClickListener() {
        	@Override
        	public void onItemClick(AdapterView<?> parent, View view, int position,
        			long id) {
        		TextView tv = (TextView) view;
        		Toast.makeText(getApplicationContext(), tv.getText(), Toast.LENGTH_LONG).show();
        	}
		};
        ListView lv = getListView();
        lv.setTextFilterEnabled(true);
        lv.setOnItemClickListener(listener);
    }
}

Per quanto riguarda i vari “import”, mi lascio aiutare da Eclipse.

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...