Ciao, dopo aver realizzato una semplice listview in Android iniziamo a vedere come applicare un custom Adapter per realizzarne una più complessa. Innanzitutto creiamo con il linguaggio XML un listitem, cioé un elemento singolo della lista, in questo modo:
listitem.xml
<?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="wrap_content"
android:background="@drawable/list_selector"
android:orientation="horizontal"
android:padding="5dip" >
<!-- immagine sinistra -->
<LinearLayout android:id="@+id/thumbnail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="3dip"
android:layout_alignParentLeft="true"
android:layout_marginRight="5dip">
<ImageView
android:id="@+id/list_image"
android:layout_width="45dip"
android:layout_height="45dip"
android:contentDescription="image"
android:src="@drawable/icon"/>
</LinearLayout>
<!-- Titolo della canzone-->
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/thumbnail"
android:layout_toRightOf="@+id/thumbnail"
android:text="Message in a bottle"
android:textColor="#040404"
android:typeface="sans"
android:textSize="17dip"
android:textStyle="bold"/>
<!-- Nome dell'artista -->
<TextView
android:id="@+id/description"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/title"
android:layout_marginTop="1dip"
android:layout_toRightOf="@+id/thumbnail"
android:layout_toLeftOf="@+id/arrow"
android:text="Police"
android:textColor="#343434"
android:textSize="12dip" />
<!-- Freccia -->
<ImageView
android:id="@+id/arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:src="@drawable/arrow"/>
</RelativeLayout>
Fatto questo dobbiamo creare il layout con la listview della nostra MainActivity sempre in XML:
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".Camper" >
<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/gradient_bg"
android:divider="#005b00"
android:dividerHeight="1dp" />
</RelativeLayout>
Ora arrivati a questo punto dobbiamo creare una classe per istanziare degli oggetti di tipo ElementoLista con i suoi metodi Getter e Setter:
ElementoLista.javapublic class ElementoLista {
private String titolo;
private String descrizione;
public ElementoLista(String titolo, String descrizione) {
this.titolo = titolo;
this.descrizione = descrizione;
}
public String getTitolo() {
return titolo;
}
public void setTitolo(String titolo) {
this.titolo = titolo;
}
public String getDescrizione() {
return descrizione;
}
public void setDescrizione(String descrizione) {
this.descrizione = descrizione;
}
}
Fatto questo dobbiamo assegnare i dati del nostro oggetto al listitem. per fare questo abbiamo bisogno del CustomAdapter:
CustomAdapter.java
public class CustomAdapter extends ArrayAdapter<ElementoLista>{
public CustomAdapter(Context context, int textViewResourceId,
List <ElementoLista> objects) {
super(context, textViewResourceId, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.listitem, null);
TextView titolo = (TextView)convertView.findViewById(R.id.title);
TextView descrizione = (TextView)convertView.findViewById(R.id.description);
ElementoLista c = getItem(position);
titolo.setText(c.getTitolo());
descrizione.setText(c.getDescrizione());
return convertView;
}
}
Nella nostra MainActivity quindi inizializiamo la listview e istanziamo gli oggetti:
MainActivity.java
setContentView(R.layout.activity_main);
ListView listView = (ListView)findViewById(R.id.list);
List <ElementoLista> list = new LinkedList <ElementoLista>();
list.add(new ElementoLista("Police","Don't stand so close to me"));
list.add(new ElementoLista("Rihanna","Love the way you lie"));
list.add(new ElementoLista("Marco Mengoni","L'essenziale"));
CustomAdapter adapter = new CustomAdapter(this, R.layout.listitem, list);
listView.setAdapter(adapter);
Infine quindi avremo una lista composta dal layout listitem e con i dati (titolo e artista) che abbiamo passato al costruttore dell'oggetto ElementoLista. Questo è un semplice esempio da raffinare ma che costituisce una buona base di partenza per creare liste personalizzate.
Sono un appassionato di informatica, mi dedico allo sviluppo web e alla gestione dei sistemi web-based: realizzo siti e progetto software gestionale per privati e aziende. Ho tanta passione per tutto quello che riguarda il web e le nuove tecnologie, lavoro bene in team e collaboro con aziende e professionisti di settore.
Ciao Andrea, per aggiungere un evento ItemClickListener a questo esempio potremmo scrivere:
listView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id){
switch(position){
case 0://codice che verrà eseguito quando farai tap sul primo elemento della lista; break;
case 1://codice che verrà eseguito quando farai tap sulsecondo elemento della lista;break; }
});
In parole povere position è la posizione dell'elemento su cui l'utente fa tap. Nel costrutto switch possiamo richiamare qualsiasi funzione anche una nuova Activity.