Adapter: ho avuto a che fare con due tipi di adapter: uno che può essere utile per connettere una matrice di elementi con un controllo tipo GridView o ListView, uno che invece connette con questi controlli un database.
Inizio il ripasso con una matrice.
Ora, mentre in JavaScript abbiamo l'oggetto Array, in Java ci sono alcune classi che non mi risultano ancora molto chiare nel maneggiarle...
Ho usato ArrayList, che, dato che la sintassi che dichiara una variabile è corretta anche con List, dovrebbe essere una classe derivata da List.
Ecco il codice:
public class MainActivity extends Activity {
List lista;
GridView grid;
Adapter adattatore;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lista=new ArrayList();
grid=(GridView)findViewById(R.id.gridView1);
adattatore=new Adapter();
grid.setAdapter(adattatore);
lista.add("Mammolo");
lista.add("Gongolo");
lista.add("Pisolo");
lista.add("Eolo");
lista.add("Dotto");
lista.add("Cucciolo");
lista.add("Brontolo");
}
class Adapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return lista.size();
}
@Override
public String getItem(int position) {
// TODO Auto-generated method stub
return (String)lista.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView=inflater.inflate(R.layout.hills, null);
TextView testo=(TextView)convertView.findViewById(R.id.textView1);
testo.setText(getItem(position));
return convertView;
}
}
Ottengo una griglia di elementi di forma rettangolare con lo sfondo che avevo selezionato per il layout da inserire in ogni elemento della GridView, e sulla TextView di ognuno di essi compare uno dei nomi dei sette nani che ho messo nell'ArrayList.
Dov'è che il BaseAdapter acquisisce i dati della matrice da usare?
Ecco, individuo i tre metodi forniti automaticamente:
@Override
public int getCount() {
// TODO Auto-generated method stub
return lista.size();
}
@Override
public String getItem(int position) {
// TODO Auto-generated method stub
return (String)lista.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
in cui appare il nome
lista che è appunto il nome che ho dato alla mia ArrayList.
Ma nel secondo la procedura automatica mi dava
Object: forse devo inserire un generic?
Ci riprovo: distruggo il mandala e lo riedifico.
class adapter extends BaseAdapter{
}
No: ottengo un segnale di errore:
The type BaseAdapter is not generic; it cannot be parameterized with arguments <String>
Forse quando si tratta di ArrayAdapter le cose stanno diversamente.
Comunque con i tre metodi suddetti otteniamo:
- Numero degli elementi
- Elemento a una data posizione;
- Posizione
Questi vengono poi usati nel momento in cui vengono messi nella TextBox dell'elemento corrispondente.
Innanzitutto, il processo di inflataggio e disposizione nella Grid viene eseguito un numero di volte corrispondente al numero di elementi nella matrice;
Quindi l'elemento e la posizione verranno utilizzati al momento della creazione, per individuare l'elemento da usare con il layout inflatato volta per volta.
Ora voglio focalizzarmi soltanto sull'inflataggio del layout e sul numero di volte che viene effettuato.
Elimino le informazioni relative al singolo elemento e l'inserimento di testo nelle TextView del layout, limitandomi solo all'inflataggio.
class Adapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return lista.size();
}
@Override
public String getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView=inflater.inflate(R.layout.hills, null);
return convertView;
}
}
Per tenere sotto controllo tute le volte che viene effettuato un "inflate" di una view, ho disposto in modo che nella finestra LogCat venisse lasciato un messaggio ogni volta che si fa un "inflating":
class Adapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return 50;
}
@Override
public String getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView=inflater.inflate(R.layout.hills, null);
Log.d("INFLATAGGIO","INFLATAGGIO");
return convertView;
}
}
Ed ecco il LogCat:
01-10 12:45:59.567: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.567: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.597: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.607: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.607: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.607: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.607: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.607: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.637: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.637: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.637: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.637: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.637: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.637: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.637: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.637: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.637: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.637: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.637: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.637: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.637: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.637: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.637: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.657: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.657: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.667: D/gralloc_goldfish(6024): Emulator without GPU emulation detected.
01-10 12:45:59.697: W/IInputConnectionWrapper(1530): showStatusIcon on inactive InputConnection
01-10 12:45:59.717: I/ActivityManager(1224): Displayed com.example.lab10/.MainActivity: +1s369ms
01-10 12:45:59.717: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:45:59.737: D/INFLATAGGIO(6024): INFLATAGGIO
Ne conto 27.
Sull'activity la mia GridView ne ha 21.
Ora "scrollo" la mia GridView e vediamo cosa succede in LogCat.
01-10 12:48:57.410: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:48:57.410: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:48:57.430: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:48:57.500: D/dalvikvm(6024): GC_FOR_ALLOC freed 8161K, 51% free 8048K/16300K, paused 4ms, total 8ms
01-10 12:48:57.880: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:48:57.890: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:48:57.930: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:48:59.760: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:48:59.760: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:48:59.760: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:00.270: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:00.270: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:00.270: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:00.880: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:00.880: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:00.890: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:01.070: I/Choreographer(6024): Skipped 44 frames! The application may be doing too much work on its main thread.
01-10 12:49:02.210: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:02.210: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:02.210: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:02.380: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:02.380: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:02.380: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:02.600: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:02.600: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:02.600: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:03.340: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:03.340: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:03.350: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:04.740: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:49:04.740: D/INFLATAGGIO(6024): INFLATAGGIO
Sono 29.
La somma supera 50.
Scrollo indietro...
01-10 12:52:23.433: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:23.433: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:23.443: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:23.773: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:23.773: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:23.783: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:24.053: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:24.053: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:24.113: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:24.963: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:24.963: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:24.973: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:25.093: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:25.103: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:25.103: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:25.243: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:25.243: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:25.243: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:25.373: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:25.373: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:25.373: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:25.413: D/dalvikvm(6024): GC_FOR_ALLOC freed 897K, 33% free 10964K/16300K, paused 29ms, total 34ms
01-10 12:52:26.203: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:26.203: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:26.203: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:26.273: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:26.273: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:26.273: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:26.363: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:26.363: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:26.363: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:27.463: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:27.463: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:27.463: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:27.533: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:27.533: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:27.533: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:27.643: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:27.653: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:27.653: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:27.663: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:27.663: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:27.663: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:27.733: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:27.743: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:27.743: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:27.883: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:27.883: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:27.923: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:28.113: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:28.113: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:28.113: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:28.183: D/dalvikvm(6024): GC_FOR_ALLOC freed 12K, 21% free 12967K/16300K, paused 11ms, total 12ms
01-10 12:52:28.753: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:28.753: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:28.773: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:28.813: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:28.823: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:28.823: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:28.943: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:28.943: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:30.713: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:30.713: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:30.713: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:30.793: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:30.803: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:30.803: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:30.853: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:30.913: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:30.913: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:30.913: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:30.913: D/INFLATAGGIO(6024): INFLATAGGIO
01-10 12:52:30.913: D/INFLATAGGIO(6024): INFLATAGGIO
Scorrendo sotto e sopra la GridView, ogni volta si ha un nuovo inflataggio.
Ogni volta che l'applicazione, o chi per lei, riceve un elemento della GridView, inflata nuovamente una view e ce la mette, anche se per quell'elemento la view è già stata inflatata.
Ecco dunque la condizione per cui la convertview ricevuta come parametro non sia nulla per inflatarne una nuova:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView!=null){
LayoutInflater inflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView=inflater.inflate(R.layout.hills, null);
Log.d("INFLATAGGIO","INFLATAGGIO");
}
return convertView;
}
...e vediamo:
01-10 13:19:13.935: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.015: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.015: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.015: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.015: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.015: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.015: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.015: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.015: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.055: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.055: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.055: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.095: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.095: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.095: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.095: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.095: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.095: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.115: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.115: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.115: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:19:14.115: I/Choreographer(2766): Skipped 41 frames! The application may be doing too much work on its main thread.
01-10 13:19:14.115: D/INFLATAGGIO(2766): INFLATAGGIO
Ne conto 22.
Quelle visibili sono 21.
Vediamo cosa accade "scrollando":
01-10 13:43:50.157: D/INFLATAGGIO(2766): INFLATAGGIO
01-10 13:43:50.157: D/INFLATAGGIO(2766): INFLATAGGIO
...e non più! Questo significa che ogni volta che il metodo getView riceve una convertView "nuova" inflata ex novo la view, mentre se riceve una convertView già inflatata (quelle che si nascondono scrollando) non la inflata più, risparmiandosi un sacco di lavoro.
Questo indipendentemente da ogni specifica matrice di elementi da porre nella GridView.
Non sono concetti facili da farmi digerire...