Autore Topic: chiarimento su ArrayAdapter  (Letto 851 volte)

Offline AndreaNobili

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
chiarimento su ArrayAdapter
« il: 02 Settembre 2011, 13:30:19 CEST »
0
Ciao,
stò studiando sul libro di Massimo Carli ed avrei qualche domanda da fare sull'uso di ArrayAdapter (più che altro per vedere se ho capito bene questo argomento ed il concetto di Adapter in generale...)

L'esempio che fà sul libro mette a disposizione le seguenti 3 risorse:

1) Un file chiamato arrays.xml: che contiene un array con 10 valori di tipo String:

Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>

<resources>
        <string-array name="array_data">
                <item>Value 1</item>
                <item>Value 2</item>
                <item>Value 3</item>
                <item>Value 4</item>
                <item>Value 5</item>
                <item>Value 6</item>
                <item>Value 7</item>
                <item>Value 8</item>
                <item>Value 9</item>
                <item>Value 10</item>
        </string-array>
</resources>

2) Un layout main.xml: che contiene una ViewList che serve a visualizzare una lista di oggetti scrollabile verticalmente:

Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>

<!-- E' una particolare View che mostra oggetti in una lista scrollabile verticalmente. E' associata ad un ListAdapter  -->
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/arrayList"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
</ListView>

3) Un altro layout row.xml che dovrebbe rappresentare la View che di fatto implementa una specifica riga della ListView:

Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>

<!-- Definisce la View associata a ciascuna riga della ListView (a ciascun elemento da visualizzare su una riga) -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/row"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent">
       
        <Button
                android:id="@+id/Button01"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/button_label">
        </Button>
       
        <TextView
                android:id="@+id/rowText"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Default Text">
        </TextView>
       
</LinearLayout>

Poi il codice dell'Activity è il seguente:

Codice: [Seleziona]
package it.apogeo.android.cap05.arrayadaptertest;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class ArrayAdapterTestActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
               
                // Impostiamo il Layout:
                setContentView(R.layout.main);
               
                // Otteniamo il riferimento alla ListView tramite il suo id:
                ListView listView = (ListView) findViewById(R.id.arrayList);
               
                // Otteniamo il riferimento all'array dei dati:
                String[] arrayData = getResources().getStringArray(R.array.array_data);
               
                // Creiamo l'ArrayAdapter:
                ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,R.layout.row,R.id.rowText,arrayData);
                //ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,arrayData);
                // Lo impostiamo come adapter della listView
                listView.setAdapter(arrayAdapter);
        }
}

Dopo aver ottenuto i riferimenti alla ListView ed all'array di stringhe (fin quì è chiarissimo) crea un oggetto di tipo ArrayAdapter.

Da quello che ho capito in questo caso l'ArrayAdapter wrappa dei dati di tipo String...

Le cose che mi sono poco chiare sono relative ai parametri passati al costruttore dell'ArrayAdapter:
this dovrebbe essere il contesto, ma cosa si intende esattamente con contesto?
R.layout.row credo che sia per dirgli che la singola riga da visualizzare nella ListView sia quella definita nella View definita dal file row.xml, giusto?
arrayData credo che sia semplicemente per dirgli da dove tirare fuori i dati da inserire su ogni singola riga, qualcosa tipo: prima riga --> prima posizione nell'array, seconda riga --> seconda posizione nell'arrray e così via

Infine setta l'Adapter sulla specifica ListView per dirgli che il contenuto di quella specifica ListView deve essere generato dall'Adapter appena creato...

Ma in pratica l'Adapter è come se mi generasse di volta in volta delle View (quelle relative alle righe della ListView) in base al contenuto dell'array di dati che viene iterato di volta in volta per creare una nuova riga?

Ho capito bene o stò facendo molta confusione?

Questo argomento me lo stò trovando un po' ostico...

Grazie
Andrea




















Offline pivot

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Sistema operativo:
    Windows
Re:chiarimento su ArrayAdapter
« Risposta #1 il: 02 Settembre 2011, 17:05:45 CEST »
0
Direi che sei sulla buona strada.

Il context serve per richiedere certe risorse che sono legate al contesto dell'applicazione (semplificando), per esempio serve per gestire gli intents. Comunque non preoccuparti per il context ora.

L'adapter è colui che collega i dati (l'array) e la GUI (ListView). Per ogni posizione lui sa quali dati prelevare (dall'array) e che oggetti grafici istanziare.
Nel caso di ArrayAdapter, si trattano solo oggetti stringa, o meglio, se passi altri oggetti lui valuta il metodo toString. Per questo ha bisogno che nel layout della singola riga (row.xml) ci sia un TextView. Lui gestirà solo il suo contenuto.

Se ti serve qualcosa di più complesso poi crearti il tuo adapter. E' più semplice di quanto sembri. Te lo dico perché sono anche io alle prime armi e l'ho fatto da poco.

Ciao

Offline xixietto

Re:chiarimento su ArrayAdapter
« Risposta #2 il: 21 Settembre 2015, 09:07:04 CEST »
0
è possibile impostare piu arrayadapter ?
ho due textview nella listview