Com\’è dura la professione!

9 dicembre 2007

Android: visualizzare voci in una ListView

Filed under: Android,Java,Programmazione — lbell @ 11:34
Tags:

Il modo più semplice in Android di visualizzare voci con un oggetto ListView è utilizzando l’oggetto ArrayAdapter<String>, che agisce da interfaccia tra una rappresentazione testuale dei dati e la ListView. Il suo costruttore accetta un id di risorsa di tipo Layout, contenente una TextView utilizzata ad ogni riga per la visualizzazione dei dati.
Se dovessimo avere l’esigenza di presentare in modo diverso le varie voci possiamo farlo in modo semplice, sfruttando l’ottima ingegnerizzazione della classe Adapter generica, parametrizzandola per i nostri scopi. Supponiamo di dover mostrare un’icona a fianco della descrizione di una voce nel caso che il testo di quest’ultima contenga una certa sequenza di caratteri; per fare un esempio semplice controlliamo solo che il testo inizi per ‘a’.
Prima di tutto ci servono due oggetti derivati dalla classe View che mostreranno i dati a video. La prima, ‘SView1’ nel nostro esempio, semplicemente deriva da TextView e verrà popolata con la stringa passata come parametro.

public class SView1 extends TextView {
TextView mText;
public SView1 (Context context, String text)
{
super(context);
setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
setText(text);
}
}

La seconda, ‘SView2’, è leggermente più complessa, deriva da LinearLayout, una classe che può raggruppare viste contenute in essa. In SView2 verranno creati due oggetti figlio, una ImageView per contenere l’icona, letta dal file di risorse, ed una TextView per contenere la stringa dei dati.

public class SView2 extends LinearLayout {
String Title=””;
TextView mText;
ImageView mView;
public SView2 (Context context, String text)
{
super(context);
this.setOrientation(HORIZONTAL);
setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
mView = new ImageView(mContext);
mView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
mView.setImageResource(R.drawable.icon);
addView(mView);
mText = new TextView(context);
mText.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
addView(mText);
setText(text);
}
public void setText(String text)
{
mText.setText(text);
}
}

Quello che ora ci resta da fare è di personalizzare il gestore dei dati, l’Adapter. Possiamo creare una classe che derivi direttamente da ArrayAdapter<>, ereditandone i metodi di gestione dei dati contenuti ed eseguire un overloading del solo metodo getView, invocato dal ListView collegato, alla visualizzazione di ogni riga di dati. Quello che faremo in questo metodo è solamente controllare il contenuto della stringa ed in base a questo decidere il tipo della vista da utilizzare, SView1 o SView2. Il ListView ci può proporre di riutilizzare un oggetto esistente, se vogliamo usufruire di questa possibilità occorre controllare che il tipo di oggetto proposto sia adatto al dato. Il passo finale si svolge nell’Activity: dobbiamo creare l’Adapter e popolarlo con i nostri dati. In calce trovate il listato dell’Adapter e della Activity.

Dimenticavo: ieri è nato RubyOnRails 2.0, ancora felicitazioni

http://weblog.rubyonrails.org/2007/12/7/rails-2-0-it-s-done

Adapter:

public class SimpleStringAdapter extends ArrayAdapter<String> {

public SimpleStringAdapter(Context context, List<String> Items ) {
super(context,R.layout.a,Items);
}
public View getView(int position, View convertView, ViewGroup parent) {
String s = getItem(position);
boolean isType1 = true;
if( s==null )
s = “”;
if(s.startsWith(“a”))
{
isType1 = false;
}
if(isType1)
{
SView1 theView ;
if((null==convertView )||!(convertView instanceof SView1))
theView = new SView1(super.getContext(),s);
else
{
theView = (SView1)convertView;
theView.setText(s);
}
return theView ;
} else
{
SView2 theView ;
if((null==convertView )||!(convertView instanceof SView2))
theView = new SView2(super.getContext(),s);
else
{
theView = (SView2)convertView;
theView.setText(s);
}
return theView ;
}
}
}

Activity:

public class SimpleView extends ListActivity {
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);

List<String> items = new ArrayList<String>();
items.add(“a riga 1”);
items.add(“a riga 2”);
items.add(“b riga 3”);
items.add(“a riga 4”);

SimpleStringAdapter strings =
new SimpleStringAdapter(this, items);
setListAdapter(strings);
}
}

1 commento »

  1. Ciao,
    ho trovato MOLTO interessante questo post….
    Una domanda: avendo un layout definito nelle risorse res/layout, come posso estendere una classe da tale layout e aggiungere viste???

    PS; se avete voglia di unirvi, siete i benvenuti su http://groups.google.com/group/google-android-sviluppatori

    Commento di Luca — 25 novembre 2008 @ 21:50 | Rispondi


RSS feed for comments on this post. TrackBack URI

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

Crea un sito o un blog gratuitamente presso WordPress.com.

%d blogger cliccano Mi Piace per questo: