Autore Topic: Resettare uno spinner con valori nel DB  (Letto 648 volte)

Offline pamide

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    tablet HTC Flyer
  • Sistema operativo:
    Mac OS X 10.5
Resettare uno spinner con valori nel DB
« il: 02 Giugno 2012, 10:53:25 CEST »
0
Ciao!

Introduzione:
Io non ho molta esperienza con Android. Ho comprato l'anno scorso un tablet e ho fatto un corso di programmazione. Adesso sto lavorando al mio primo programma (beh, gli esercizi non contano). Devo confessare che non ho esperienza Java. Avevo fatto anni fa un corso, ma comunque vedo che mi aranggio abbastanza.

Problema:

Nell'applicazione ho uno spinner con valori (String) presenti nel DB. Io posso accedere ad un'altra activity per inserire e cancellare questi valori.
Quando torno aggiorno la lista di valori e tutto sembra funzionare.
Cosa succede? Se il valore corrente dello spinner è l'ultimo nella lista e poi vado nella seconda activity a cancellare proprio questo valore, quando torno lo spinner mi resta sull'ultimo valore. Facendo qualcosa del tipo
persona_selez = (Persona) spn_LOV_Persone.getSelectedItem();
mi da (ovviamente) errore IndexOutOfBounds.
Potrei impostare "SelectedItem" a 0, ma se ho cancellato tutti i valori dal DB? Potrei controllare la lunghezza della lista associata...

Però mi chiedo se non esiste un metodo più elegante per resettare uno spinner. Faccio presente che io aggiorno la lista associata e notifico l'array adapter del cambiamento, solo che lui "resta" sull'ultimo valore selezionato anche se non presente nella lista. O almeno a me sembra così.

Grazie,
Miky

Offline DarnellNajanReed

  • Utente normale
  • ***
  • Post: 359
  • Respect: +49
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One, Acer Iconia A500/501, Asus Transformer Prime, Galaxy ACE, Galaxy S Plus, Galaxy S Advance P, Galaxy Tab 2 7.0, Google Nexus 7
  • Play Store ID:
    Luigi Notaro
  • Sistema operativo:
    OS X 10.8.3
Re:Resettare uno spinner con valori nel DB
« Risposta #1 il: 02 Giugno 2012, 11:43:35 CEST »
0
Citazione
Cosa succede? Se il valore corrente dello spinner è l'ultimo nella lista e poi vado nella seconda activity a cancellare proprio questo valore, quando torno lo spinner mi resta sull'ultimo valore
A che stadio del ciclo di vita dell'Activity fai il "refresh" della lista con la notifica? sull'onResume?
Magari posta un pò di codice  :-)

Offline pamide

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    tablet HTC Flyer
  • Sistema operativo:
    Mac OS X 10.5
Re:Resettare uno spinner con valori nel DB
« Risposta #2 il: 02 Giugno 2012, 13:02:55 CEST »
0
Allora uso onResume visto che viene eseguito sempre. La lista viene aggiornata in CreaLista(). Poi ripristino dalle preferenze il valore in ValInizPersonaAnno().
Come vedi, ho usato setSelection (0) e mi sembra funzioni anche se non mi spiego ancora bene come mai non da errore quando non ci sono elementi nella lista.
Provo allegare tutta la classe..

Grazie,
Miky

Codice (Java): [Seleziona]
    public void onResume ()
    {
                Log.d ("MIKY", "onResume");
               
                super.onResume();
                //Log.d ("MIKY", "onResume");
               
                // aggiorno la lista di persone dopo averla eventualmente modificata nell'activity InsPersone
                CreaLista();
               
                //if (AA_elenco_pers == null) Log.d ("MIKY", "elenco null");
                AA_elenco_pers.notifyDataSetChanged();
               
                // all'apertura del programma imposto la persona all'ultima utilizzata, salvata nelle preferenze
                // all'uscita dal programma; e l'anno all'anno corrente
                ValInizPersonaAnno();
                               
                // aggiorno la lista di importi
        AggiornaElencoSpese();
    }


    private void ValInizPersonaAnno ()
    {
                // leggo dalle preferenze la persona salvata
                Persona pers_salvata = Pref_mgr.getPersona (this);
                //Log.d ("MIKY", "pers salvata: " + pers_salvata.getNome());
                // trovo la posizione della persona nella lista delle persone
                int posiz = posizPersSalvata (pers_salvata);
                //Log.d ("MIKY", "Posiz. persona " + posiz);
                if (posiz != -1)  
                        spn_LOV_Persone.setSelection (posiz);
                else // evito l'errore quando la persona salvata nelle preferenze e' stata cancellata
                        spn_LOV_Persone.setSelection (0);
...

    private int posizPersSalvata (Persona p)
    {
        if (p == null) return -1;
       
        int i = -1;
        for (Persona pers: AL_pers)
        {
                i++;
                if (p.getId() == pers.getId() && p.getNome().compareTo(pers.getNome()) == 0)
                        return i;
        }
        return -1;
    }
« Ultima modifica: 02 Giugno 2012, 13:07:01 CEST da Ricky`, Reason: tag code!!! »