-
Androidiani Power User
[Facile] ListView con Custom Adapter
Livello di difficoltà: facile.
Versione target SDK utilizzata: 19.
Versione minima SDK: 8.
In questo tutorial spiegherò come realizzare una ListView con un adattatore personalizzato, in base alle proprie esigenze. Per questa guida l'adapter sarà composto semplicemente da una ImageView e due TextView. Iniziamo!
Per prima cosa è necessario creare il layout collegato all'activity principale, che avrà come unico elemento una semplice ListView. Andiamo quindi in /res/layout/ apriamo il file activity_main.xml e inseriamo al suo interno:
Quindi rechiamoci nell'Activity principale in /src/ e apriamo MainActivity.java. Inseriamo:
Le prime tre righe di codice prevedono la dichiarazione di due array di stringhe (String[]), l'Adapter (che creeremo tra poco) e la ListView. Per creare l'Adapter torniamo nuovamente in /res/layout/ e creiamo un nuovo file che chiameremo adapter.xml. Inseriamo:
Quindi, di nuovo in /src/ creiamo una classe che chiamiamo Adapter.java, nella quale inseriremo:
Come vedete il costruttore prevede tre parametri: il contesto, l'array di stringhe dei testi e dei sotto-testi. Il metodo getView() è molto importante. Esso si occupa della gestione del singolo elemento dalla lista. I parametri al suo interno sono: la posizione, view e parent. Soffermiamoci su questi ultimi due: il parametro view, se opportunamente ottimizzato ci permette di rendere la lista molto fluida nello scroll ed evitare quindi i fastidiosi lag dovuti, appunto, alla mancata ottimizzazione. In maniera spicciola, view ci consente di riciclare l'eventuale View che anzichè essere "rigenerata" viene riciclata, ragion per cui viene fatto il controllo. Se è nulla, tramite l'operazione di Inflating la creiamo, altrimenti la ricicliamo. Il parametro parent è il contenitore avente il compito di raccogliere gli elementi generati dal metodo getView(). Generalmente è la ListView stessa. L'oggetto Holder consente di memorizzare il riferimento alle View in ogni singola riga della lista. Tramite il metodo setTag() associamo l'oggetto Holder alla View, per poi riottenerlo col getTag(). Questi piccoli accorgimenti nel complesso rendono la lista efficiente, evitando sprechi di risorse, di memoria, oltre che evitano il presentarsi di lag/impuntamenti.
Questo è tutto. Per ulteriori chiarimenti potete scrivere in questa discussione. Un ringraziamento speciale all'utente supertommino.
Ultima modifica di Crotan; 31-01-14 alle 20:05
-
I seguenti 2 Utenti hanno ringraziato Crotan per il post:
KlaasMad (31-01-14),wuby (29-05-14)
-
-
Androidiani Power User
Riservato per future aggiunte.
-
-
Al click sulla riga non è chiaro però a quale activity della mia app si viene indirizzati. Come si può fare ciò ?
-
-
Il codice quando fai tap su una riga ti mostra in un Toast dice quale riga hai premuto, non viene lanciata nessuna activity.
-
-
Per lanciare una activity specifica come faccio?
Ho inserito più Intent in corrispondenza di ogni activity da visitare ma mi visita sempre la medesima activity. Posso spostare il codice?
-
-
-
-
Androidiani Power User
@sebastiano74, posta il codice.
-
-
di seguito il codice Java:
All'interno del metodo OnCreate
String[] accessori = { "Wind.it", "Digital Store Wind", "Play Store", "eBay", "Amazon", "Samsung Store", "Apple Store", "Windows Store", "Disney Store"};
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_ list_item_1,accessori);
ListView lv= (ListView) findViewById(R.id.elencoaccessori);
lv.setAdapter(adapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> adattatore, final View componente, int pos, long id) {
//recupero il titolo memorizzato nella riga tramite l'ArrayAdapter
final String titolo = (String) adattatore.getItemAtPosition(pos);
//al click compare il testo del titolo della riga per qualche secondo
Toast.makeText(getApplicationContext(), titolo, Toast.LENGTH_SHORT).show();
Fino a qui tutto ok, funziona tutto
Adesso vorrei inserire su ogni riga visualizzata un link di collegamento ad un'altra MainActivity.
Dopo il Toast ho inserite il seguente codice:
Intent visit_wind = new Intent(MainActivity_3_canali.this, MainActivity_wind.class);
startActivity(visit_wind);
Ma ho notato che in questo modo tutte le righe della mia ListView mi portano sulla MainActivity_wind.
Come posso indirizzare ogni singola riga della LisView alla sua MainActivity specifica???
-
-
Ma come fare se i valori che devo inserire nella listview sono dei dati presi nel DB?
-
-
Androidiani Power User
Basta avere un metodo che restituisce un Array con i valori recuperati dal Database SQLite e passare quello all'Adapter. Qui trovi istruzioni su come creare questo metodo: How to retrieve data from sqlite database in android and display it in TextView - Stack Overflow.
-
Permessi di invio
- Non puoi inserire discussioni
- Non puoi inserire risposte
- Non puoi inserire allegati
- Non puoi modificare i tuoi messaggi
-
Regole del Forum