Autore Topic: Sovrascrittura non voluta elementi (Array e ArrayList)  (Letto 1019 volte)

Offline gyagi

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG P500
  • Sistema operativo:
    W7 x64
Sovrascrittura non voluta elementi (Array e ArrayList)
« il: 12 Gennaio 2012, 17:08:48 CET »
0
Ho un piccolo (grande) problema.
Da poco ho preso in mano la programmazione per Android (dopo 6 anni di inattività su Java e 4 anni di intensa attività con Delphi e PHP),al di la delle miriadi di novità del linguaggio (java) e di quelle introdotte da android e della relativa logica,mi sto trovando difronte ad un problema non da poco.

Ho un piccolo Db, al momento di una tabella, dove vado a segnarmi dei record che contengono dei parametri. (Creazione db,read e write mi riescono correttamente)

Questi record andranno a popolare una listview tramite il relativo setAdapter con passaggio di un oggetto Arrayadapter e relativo override del getView etc..

Il mio problema nasce prima di arrivare all'istanza di un oggetto arrayAdapter.
Praticamente, quando vado a popolare l'array list di oggetti Orario, appena esce dal ciclo while che lo riempie, rimpiazza tutti gli elementi con l'ultimo inserito.

Il codice che mi da il problema:
Codice (Java): [Seleziona]
           

final ArrayList<Orario> arrayOrario = new ArrayList<Orario>();

          while(cursor.moveToNext()){                  

                arrayOrario.add(new Orario(cursor));
                Log.i("Create main","I:"+ cursor.getPosition() + " pk:"+ arrayOrario.get(cursor.getPosition()).getPk());
                       
                }    
        //fino a qui il Log mi scrive correttamente indice e relativo pk dell'oggetto che saranno i = 0 - pk = 3,i = 1 pk = 2, i = 2 - pk = 1.    
   
        Log.i("Create main", "Create adapter "+arrayOrario.size());//controllo nuovamente quanti oggetti ho nell'arraylist
       
        for(int i = 0;i< arrayOrario.size();i++){
                Log.i("Create main","I:"+ i + " pk:"+ arrayOrario.get(i).getPk());
        }

Il logcat:
01-12 16:45:20.362: I/Create main(1208): Record: 3
01-12 16:45:20.362: I/Create main(1208): I:0 pk:2
01-12 16:45:20.372: I/Create main(1208): I:1 pk:3
01-12 16:45:20.372: I/Create main(1208): I:2 pk:1
01-12 16:45:20.372: I/Create main(1208): Create adapter 3
01-12 16:45:20.372: I/Create main(1208): I:0 pk:1
01-12 16:45:20.372: I/Create main(1208): I:1 pk:1
01-12 16:45:20.372: I/Create main(1208): I:2 pk:1


Nel for invece mi scrive correttamente 3 volte i log (3 elementi) però, all'indice i vedo i valori 0,1,2 mentre sul getPk() io vedo sempre e solo il PK dell'ultimo elemento dell'arrayList che nel mio caso è 1.
Dove sto sbagliando?
Il resto del codice funziona correttamente salvo per questo particolare non da poco e il programma si avvia e funziona secondo logica.
Questo problema mi pregiudica ovviamente l'usabilità..Facendo in sostanza riferimento sempre allo stesso record nella tabella,avendo tutti gli elementi pk = 1.

Grazie

« Ultima modifica: 12 Gennaio 2012, 17:23:29 CET da gyagi »

Offline Gigiuz

  • Utente normale
  • ***
  • Post: 187
  • Respect: +23
    • Google+
    • gigiuzzo81
    • Gigiuz81
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note III
  • Play Store ID:
    GGXSoft
  • Sistema operativo:
    Windows 7 64bit, OS X (virtualized), Ubuntu
Re:Sovrascrittura non voluta elementi (Array e ArrayList)
« Risposta #1 il: 12 Gennaio 2012, 20:39:56 CET »
0
Potresti postare la costruzione del tuo oggetto Orario(Cursor cursor)?
Hai bisogno di implementare un sistema di "codici seriali di sblocco" nella tua applicazione? Dai un'occhiata alla mia libreria: RemoteUnlocker

Offline gyagi

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG P500
  • Sistema operativo:
    W7 x64
Re:Sovrascrittura non voluta elementi (Array e ArrayList)
« Risposta #2 il: 13 Gennaio 2012, 09:16:05 CET »
0
Ecco qui il costruttore che riceve il cursor come parametro.


Codice (Java): [Seleziona]
       
 int idx_pk_orario = cursor.getColumnIndex("pk_orario");
                int idx_dalle_h = cursor.getColumnIndex("ora_inizio");
                int idx_dalle_m = cursor.getColumnIndex("minuti_inizio");
                int idx_alle_h = cursor.getColumnIndex("ora_fine");
                int idx_alle_m = cursor.getColumnIndex("minuti_fine");

public Orario(Cursor cursor) { 
               

        pk_orario = cursor.getInt(idx_pk_orario );
        ora_inizio = cursor.getInt(idx_dalle_h );
        minuti_inizio = cursor.getInt(idx_dalle_m);
        ora_fine = cursor.getInt(idx_alle_h);
        minuti_fine = cursor.getInt(idx_alle_m);
       
        //Log.i("Orario","terminato create "+pk_orario);
       
        }

Che sia perchè manca il this prima di ogni attributo della classe?
« Ultima modifica: 13 Gennaio 2012, 09:41:06 CET da gyagi »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Sovrascrittura non voluta elementi (Array e ArrayList)
« Risposta #3 il: 13 Gennaio 2012, 09:44:34 CET »
0
Aggiungi prima di tutto

Codice (Java): [Seleziona]
Log.i("Cursore", DatabaseUtils.dumpCursorToString(cursor));
e verifica che il cursore contiene i dati che ti aspetti ;)

Offline gyagi

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG P500
  • Sistema operativo:
    W7 x64
Re:Sovrascrittura non voluta elementi (Array e ArrayList)
« Risposta #4 il: 13 Gennaio 2012, 09:55:36 CET »
0
Il cursor ha i dati corretti ad ogni invocazione del costruttore.
Nel costruttore di Orario c'è un Log.i (commentato nel codice riportato) e mi da esattamente i dati che deve darmi.

Non è che sbaglio a mettere delle variabili di troppo? (i vari int indx_<nome>)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Sovrascrittura non voluta elementi (Array e ArrayList)
« Risposta #5 il: 13 Gennaio 2012, 09:59:42 CET »
0
Come hai modificato ora il codice (e anche per come hai chiamato le variabili, se devo essere sincero), non si capisce molto cos'hai fatto.

Comunque, il codice sembra giusto, magari c'è qualche parte che non ci hai postato. Prova a postare l'intera classe Orario.

Offline gyagi

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG P500
  • Sistema operativo:
    W7 x64
Re:Sovrascrittura non voluta elementi (Array e ArrayList)
« Risposta #6 il: 13 Gennaio 2012, 10:04:50 CET »
0
Hai ragione..pardon..
Avevo sbagliato a copiare dai sorgenti..avendo fatto delle modifiche non ancora testate..inutile chiedere aiuto su qualcosa che ho modificato e non verificato  :-)
Chiedo venia.
Il codice presente è quello corretto diciamo.

La classe orario è quella.Alla fine mi serve solo come oggetto unico senza stare li a fare mille volte invocazione di cursor etc dove mi servono (anche perchè meno leggo dal db meglio è). In più ha solo i get degli attributi e nient'altro.
C'è un ulteriore costruttore che fa le stesse cose ma con passaggio di differenti parametri.Ma per ora non viene usato,percui come non esistesse.

La stessa cosa avevo provato a farla togliendo l'array list e usando un Array di oggetti Orario..ma medesimo risultato.
Vorrei capire come mai.
Possibile che sia qualche "errore" in compilazione (o una delle fasi successive) di eclipse?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Sovrascrittura non voluta elementi (Array e ArrayList)
« Risposta #7 il: 13 Gennaio 2012, 10:14:02 CET »
0
Possibile che sia qualche "errore" in compilazione (o una delle fasi successive) di eclipse?

Se ci fossero degli errori di compilazione l'applicazione non partirebbe neanche. 
La mia impressione è che c'è qualche condizione percui gli attributi della classe sono condivisi tra le varie instanze della classe. Per questo ti chiedevo di postare il codice.

Offline gyagi

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG P500
  • Sistema operativo:
    W7 x64
Re:Sovrascrittura non voluta elementi (Array e ArrayList)
« Risposta #8 il: 13 Gennaio 2012, 10:26:10 CET »
0
Ecco la classe

Codice (Java): [Seleziona]
public class Orario {
       
        private int pk_orario;
        private static int ora_inizio;
        private static int minuti_inizio;
        private static int ora_fine;
        private static int minuti_fine;
        private static int attiva;
        private String img_src;
       
               
                int idx_pk_orario = cursor.getColumnIndex("pk_orario");
                int idx_dalle_h = cursor.getColumnIndex("ora_inizio");
                int idx_dalle_m = cursor.getColumnIndex("minuti_inizio");
                int idx_alle_h = cursor.getColumnIndex("ora_fine");
                int idx_alle_m = cursor.getColumnIndex("minuti_fine");

      public Orario(Cursor cursor) {  
               

        pk_orario = cursor.getInt(idx_pk_orario );
        ora_inizio = cursor.getInt(idx_dalle_h );
        minuti_inizio = cursor.getInt(idx_dalle_m);
        ora_fine = cursor.getInt(idx_alle_h);
        minuti_fine = cursor.getInt(idx_alle_m);
       
        //Log.i("Orario","terminato create "+pk_orario);
       
        }
       
        public Orario(int pk_orario,SQLiteDatabase db){
       
               
                this.pk_orario = pk_orario;
               
        SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
        builder.setTables("ORARI");        
        Cursor cursor = builder.query(db, null, "pk_orario = "+this.pk_orario, null, null, null, null);
       
        while(cursor.moveToNext()){
                        this.ora_inizio = cursor.getInt(cursor.getColumnIndex("ora_inizio"));
                        this.minuti_inizio = cursor.getInt(cursor.getColumnIndex("minuti_inizio"));
                        this.ora_fine = cursor.getInt(cursor.getColumnIndex("ora_fine"));
                        this.minuti_fine = cursor.getInt(cursor.getColumnIndex("minuti_fine"));                
                        this.attiva = cursor.getInt(cursor.getColumnIndex("attivo"));
                        this.img_src = cursor.getString(cursor.getColumnIndex("img_src"));
        }
       
        cursor.close();
       
        }
       

       
        public static String getInizio(){
                return  pad(ora_inizio)+":"+pad(minuti_inizio);
        }
       
        public static String getFine(){
                return  pad(ora_fine)+":"+pad(minuti_fine);
        }
       
        public static Boolean getAttivo(){
                return attiva == 1;
        }
       
        public int getPk(){
                return pk_orario;
        }
       
         private static String pad(int c) {
                    if (c >= 10)
                        return String.valueOf(c);
                    else
                        return "0" + String.valueOf(c);
                }      

}

Ho un dubbio..
Se io dichiaro gli attributi privati static nei get problemi 0..invece nel costruttore eclipse mi dice che non dovrei chiamare così(this.<attributo>) qualcosa di static.
Diversamente,se tolgo static,poi nei get eclipse si arrabbia e mi dice che non va bene richiamare così degli attributi non static.

Ammetto di essere decisamente arrugginito da Java,son 6 anni ke non tocco 1 sola linea di codice..

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Sovrascrittura non voluta elementi (Array e ArrayList)
« Risposta #9 il: 13 Gennaio 2012, 10:34:32 CET »
+1
Io cambierei il primo costruttore in questo modo:

Codice (Java): [Seleziona]
      public Orario(Cursor cursor) {  
               
                int idx_pk_orario = cursor.getColumnIndex("pk_orario");
                int idx_dalle_h = cursor.getColumnIndex("ora_inizio");
                int idx_dalle_m = cursor.getColumnIndex("minuti_inizio");
                int idx_alle_h = cursor.getColumnIndex("ora_fine");
                int idx_alle_m = cursor.getColumnIndex("minuti_fine");

        pk_orario = cursor.getInt(idx_pk_orario );
        ora_inizio = cursor.getInt(idx_dalle_h );
        minuti_inizio = cursor.getInt(idx_dalle_m);
        ora_fine = cursor.getInt(idx_alle_h);
        minuti_fine = cursor.getInt(idx_alle_m);
       
        //Log.i("Orario","terminato create "+pk_orario);
       
        }
 

cancellerei il secondo costruttore, che proprio non c'azzecca nulla, e togliere lo static dagli attributi della classe.
Poi il caricamento lo fai con il codice che hai scritto nel primo post.

Offline gyagi

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG P500
  • Sistema operativo:
    W7 x64
Re:Sovrascrittura non voluta elementi (Array e ArrayList)
« Risposta #10 il: 13 Gennaio 2012, 10:38:31 CET »
0
Ok,gli static gli ho levati tutti dalla classe (anche sui get).
Con delphi le cose sono un poco più semplici  :-P non sono più abituato a java..

Piccola domanda..magari sembra pure stupida..
Con delphi se ho più costruttori posso tranquillamente chiamare i costruttori uno dentro all'altro,mi spiego
Costruttore 3 chiama il costruttore 2 che chiama al suo interno il costruttore 1,così da non dover ripetere le operazioni di base del costruttore 1 nei costruttori 2 e poi 3.
In java è possibile sta cosa?sinceramente non mi ricordo più..Se si,come?

Tornando al codice,ora provo e ti faccio sapere.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Sovrascrittura non voluta elementi (Array e ArrayList)
« Risposta #11 il: 13 Gennaio 2012, 10:47:16 CET »
0
si, devi usare la keyword this

Codice (Java): [Seleziona]
public A(){
     this("ciao");
}

public A(String stringa){
//...
}

Offline gyagi

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG P500
  • Sistema operativo:
    W7 x64
Re:Sovrascrittura non voluta elementi (Array e ArrayList)
« Risposta #12 il: 13 Gennaio 2012, 10:51:40 CET »
0
Ottimo,grazie!!

Ho provato con le correzioni e ora sembra apposto.
Ho rimosso i vari int etc e ho fatto così:
Codice (Java): [Seleziona]
       
        this.pk_orario = cursor.getInt(cursor.getColumnIndex("pk_orario"));
        this.ora_inizio = cursor.getInt(cursor.getColumnIndex("ora_inizio"));
        this.minuti_inizio = cursor.getInt(cursor.getColumnIndex("minuti_inizio"));
        this.ora_fine = cursor.getInt(cursor.getColumnIndex("ora_fine"));
        this.minuti_fine = cursor.getInt(cursor.getColumnIndex("minuti_fine"));
        this.attiva = cursor.getInt(cursor.getColumnIndex("attivo"));
        this.img_src = cursor.getString(cursor.getColumnIndex("img_src"));
Ho fatto così perchè son certo di avere un solo record ad ogni chiamata del costruttore di Orario.

Ora mi da tutto correttamente e non tiene solo l'ultimo elemento.
Alla fine ho rimosso tutti gli static (sia sugli attributi che sui get) che i vari int indx_<colonna>.
Credo che sia stato un mix di questi due a darmi il problema.

Grazie  :-)
Son proprio arrugginito...
« Ultima modifica: 13 Gennaio 2012, 10:56:24 CET da gyagi »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Sovrascrittura non voluta elementi (Array e ArrayList)
« Risposta #13 il: 13 Gennaio 2012, 10:54:57 CET »
0
Era solo lo static. Dalla documentazione:

Citazione
Sometimes, you want to have variables that are common to all objects. This is accomplished with the static modifier. Fields that have the static modifier in their declaration are called static fields or class variables. They are associated with the class, rather than with any object. Every instance of the class shares a class variable, which is in one fixed location in memory. Any object can change the value of a class variable, but class variables can also be manipulated without creating an instance of the class.

E questo spiega perchè avevano tutti lo stesso valore.

Offline gyagi

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG P500
  • Sistema operativo:
    W7 x64
Re:Sovrascrittura non voluta elementi (Array e ArrayList)
« Risposta #14 il: 13 Gennaio 2012, 10:57:08 CET »
0
Ecco..confermo la ruggine  :-P
Grazie mille ;-)

Dato che si cono approfitto..
Altra domanda..
Perchè su
Codice (Java): [Seleziona]
   ArrayAdapter<Orario> ar = new ArrayAdapter<Orario>(this,R.layout.orario_elemento,R.id.textView1,arrayOrario){  
               
                @Override
                public View getView(int position,View convertView, ViewGroup parent)
                {}
}
viene eseguito un numero di volte pari ad arrayOrario.size() +1???lo esegue sempre na volta in + ripartendo dalla posizione 0.
Posto il resto del codice?o apro un ulteriore topic?