I cookie permettono il funzionamento di alcuni servizi di questo blog. Utilizzando questi servizi, accetti l'utilizzo dei cookie da parte nostra. Ok Rifiuta

Attenzione: a breve questo blog verrà dismesso e sarà attivo il nuovo a questo indirizzo.

Creare una list view con Custom Adapter in Android

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.java

public 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.

Seguici su Facebook

Seguici su Google+

Renzo Cappelli

miafoto

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.

Commenti

utente
Andrea ha scritto il 30/11/2014 - 12:33:48 :

Ciao mi chiedevo, facendo riferimento al tuo esempio come era possibile aggiungere un evento ItemClickListener? Grazie.
renzo cappelli
Renzo ha scritto il 30/11/2014 - 13:08:46 :

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.

utente
Ivan ha scritto il 09/05/2017 - 16:00:40 :

Grazie mille per la dritta!

Lascia il tuo commento