Livello di difficoltà: medioVersione SDK utilizzata: >1.5Link al file compresso del progetto eclipse: file in allegatoQuando vogliamo realizzare una listview con un layout personalizzato, ad esempio per una nostra classe personale, ci troviamo davanti diverse possibili implementazioni. Alcune di esse prevedono di estendere le classi BaseAdapter, ArrayAdapter o altre. In questo tutorial vorrei mostrarvi come è possibile creare una listview personalizzata utlizzando la classe SimpleAdapter, fornita dall'android SDK.
In una listview, vogliamo rappresentare una lista di oggetti appartenenti a questa classe:
public class Person {
private String name;
private String surname;
private int photoRes;
public Person(String name, String surname, int photoRes) {
super();
this.name = name;
this.surname = surname;
this.photoRes = photoRes;
}
public String getName() {
return name;
}
public String getSurname() {
return surname;
}
public int getPhotoRes() {
return photoRes;
}
}Ecco cosa vogliamo ottenere con una lista casuale di oggetti Persona:

ora per prima cosa definiamo un layout che mostra i dati di un oggetto Persona su ogni singola riga della listview:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="60dip"
android:padding="5dip">
<ImageView
android:id="@+id/personImage"
android:layout_width="50dip"
android:layout_height="50dip"
>
</ImageView>
<TextView
android:text="Nome"
android:layout_marginLeft="5dip"
android:textAppearance="?android:attr/textAppearanceLarge"
android:id="@+id/personName"
android:layout_toRightOf="@id/personImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></TextView>
<TextView
android:text="Cognome"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#6b71f1"
android:id="@+id/personSurname"
android:layout_alignLeft="@+id/personName"
android:layout_alignParentBottom="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
</RelativeLayout>come possiamo ben osservare, questo layout definisce una ImageView per il campo photoRes della classe Persona, affiancato da 2 textview disposte una sopra l'altra per i campi Name e Surname, sempre della classe Persona.
il layout dell'activity non ha nulla di particolare:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView
android:id="@+id/personListView"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</ListView>
</LinearLayout>passiamo ora al codice java:
public class Demo extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ArrayList<Person> personList=new ArrayList<Person>(); //lista delle persone che la listview visualizzerà
Person [] people={
new Person("Anna","Falchi",R.drawable.creep_1),
new Person("Cameron", "Diaz", R.drawable.creep_2),
new Person("Jessica","Alba",R.drawable.creep_3),
new Person("Manuela","Arcuri",R.drawable.creep_4)};
//riempimento casuale della lista delle persone
Random r=new Random();
for(int i=0;i<100;i++){
personList.add(people[r.nextInt(people.length)]);
}
//Questa è la lista che rappresenta la sorgente dei dati della listview
//ogni elemento è una mappa(chiave->valore)
ArrayList<HashMap<String, Object>> data=new ArrayList<HashMap<String,Object>>();
for(int i=0;i<personList.size();i++){
Person p=personList.get(i);// per ogni persona all'inteno della ditta
HashMap<String,Object> personMap=new HashMap<String, Object>();//creiamo una mappa di valori
personMap.put("image", p.getPhotoRes()); // per la chiave image, inseriamo la risorsa dell immagine
personMap.put("name", p.getName()); // per la chiave name,l'informazine sul nome
personMap.put("surname", p.getSurname());// per la chiave surnaname, l'informazione sul cognome
data.add(personMap); //aggiungiamo la mappa di valori alla sorgente dati
}
String[] from={"image","name","surname"}; //dai valori contenuti in queste chiavi
int[] to={R.id.personImage,R.id.personName,R.id.personSurname};//agli id delle view
//costruzione dell adapter
SimpleAdapter adapter=new SimpleAdapter(
getApplicationContext(),
data,//sorgente dati
R.layout.person_item, //layout contenente gli id di "to"
from,
to);
//utilizzo dell'adapter
((ListView)findViewById(R.id.personListView)).setAdapter(adapter);
}
}Voilà

Spero che questo tutorial vi sia stato utile.
Un Saluto,
Qlimax