Autore Topic: Riferimento ad una View all'interno di una ListView generata con un Adapter  (Letto 364 volte)

Offline rickyds

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • riccardodesilva
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus S
  • Sistema operativo:
    Ubuntu 11.10, Windows 8
Buongiorno! Ne approfitto per salutare tutti gli utenti in occasione del mio primo post in questo forum.
Da assoluto neofita della programmazione per dispositivi Android, che sto affrontando solo da qualche settimana, volevo chiedere un aiuto su una situazione che mi si è presentata studiando la guida per lo sviluppatore di Massimo Carli.

Inizio allegando il codice :
Codice (Java): [Seleziona]
public class ArrayAdapterTestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        ListView lw = (ListView) this.findViewById(R.id.listView);
        String[] datiArray = this.getResources().getStringArray(R.array.gusti);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.row,R.id.rowText,datiArray);
       
        lw.setAdapter(adapter);
       
    }
}

E' un'Activity che elenca i dati presenti in una risorsa di tipo string-array, raggiungibile tramite R.id.gusti, in una ListView le cui righe sono definite dal LinearLayout "R.layout.row".
Il LinearLayout presenta al suo interno solo un Button e una TextView affiancati (quest'ultima, con id "R.id.rowText",  viene utilizzata per mostrare le informazioni dell'adapter).
Il risultato è un elenco verticale di tanti LinearLayout composti da pulsante e testo quanti sono gli item dello string-array. Fino a qui tutto bene.

Ora, per scopo puramente didattico, volevo fare in modo che cliccando un qualsiasi pulsante mi comparisse un Toast che mostrasse il testo della TextView contenuta in quella riga. Come faccio ad associare un clickListener a ciascun pulsante? E come ottengo banalmente un riferimento a quest'ultimo?

Il metodo getView() dell'adapter mi permette di ricavare la TextView, ma il Button, a cui ho comunque dato un id?

Un codice esemplificativo mi sarebbe d'aiuto. Vi ringrazio già in anticipo per l'attenzione!

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Riferimento ad una View all'interno di una ListView generata con un Adapter
« Risposta #1 il: 29 Novembre 2011, 15:47:40 CET »
0
Devi usare un adapter.

Studia questo OTTIMO esempio: List14.java | Android Developers

Offline rickyds

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • riccardodesilva
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus S
  • Sistema operativo:
    Ubuntu 11.10, Windows 8
Re:Riferimento ad una View all'interno di una ListView generata con un Adapter
« Risposta #2 il: 29 Novembre 2011, 18:02:19 CET »
0
Grazie per il consiglio, anche se si introduce il concetto di ViewHolder che non ho ben chiaro e che approfondirò.

La mia situazione comunque è analoga a quella descritta in questo blog a cui sono giunto facendo una ricerca in inglese: http://androidforbeginners.blogspot.com/2010/03/clicking-buttons-in-listview-row.html

Se interessasse il modo in cui viene risolta mi sembra piuttosto semplice e fa al caso mio. Il codice diventa:
Codice (Java): [Seleziona]
public class ArrayAdapterTestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        ListView lw = (ListView) this.findViewById(R.id.listView);
        String[] datiArray = this.getResources().getStringArray(R.array.gusti);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.row,R.id.rowText,datiArray);
        lw.setAdapter(adapter);
       
    }
   
    /*
     * Gestisce il click su ogni istanza del pulsante definito nel layout R.layout.row
     * grazie all'attributo android:onClick="myClickHandler"
     */

    public void myClickHandler(View v) {
        Button btn = (Button) v;
        LinearLayout ll = (LinearLayout) btn.getParent();
        Toast.makeText(ArrayAdapterTestActivity.this, ((TextView)ll.findViewById(R.id.rowText)).getText(), Toast.LENGTH_SHORT).show();
       
    }
}

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Riferimento ad una View all'interno di una ListView generata con un Adapter
« Risposta #3 il: 30 Novembre 2011, 09:57:13 CET »
+1
Partiamo dal presupposto che la tua soluzione è corretta e funziona, su questo nulla da dire.

La critica che posso fare su questa è il fortissimo legame che hai tra il tuo layout ed il tuo codice.

Mi spiego meglio. Attualmente tu hai una situazione di questo tipo (ovviamente per semplicità di lettura tolgo tutti gli attributi dei tag che non servono: layout_height, layout_wigth, ecc...):

res/layout/home.xml
Codice (XML): [Seleziona]
<LinearLayout>
  <TextView android:id="rowText" />
  <Button android:onClick="myClickHandler" />
</LinearLayout>

Con questo xml tutto ti funziona perfettamente. Supponiamo adesso che per sfruttare le potenzialità di uno schermo più grande (vedi tablet) tu voglia aggiungere un altro xml alla tua applicazione proprio per ottimizzare il layout.

res/layout-xlarge/home.xml
Codice (XML): [Seleziona]
<LinearLayout>
  <TextView android:id="rowText" />
  <LinearLayout>
    <Button android:onClick="myClickHandler" />
  </LinearLayout>
</LinearLayout>

Ecco, questo codice fa andare in NullPointerException il tuo codice!

Personalmente ti direi di evitare questa strada imparando come usare gli Adapter (ed in seconda battuta il ViewHolder per rendere tutto più prestazionale).

Offline rickyds

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • riccardodesilva
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus S
  • Sistema operativo:
    Ubuntu 11.10, Windows 8
Re:Riferimento ad una View all'interno di una ListView generata con un Adapter
« Risposta #4 il: 30 Novembre 2011, 11:31:52 CET »
0
Capito. Ottimo consiglio e direi pienamente condivisibile, e adapter sia...