Autore Topic: Salvare un ArrayList al cambio orientamento  (Letto 435 volte)

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Salvare un ArrayList al cambio orientamento
« il: 22 Luglio 2014, 22:33:04 CEST »
0
Salve, io avrei bisogno di creare una ListView, in cui delle stringhe inserite dinamicamente, al cambio d'orientamento del dispositivo, non vengano perdute, e rimandate a video. Allora ho provato a scrivere così:

Codice (Java): [Seleziona]
public class MainActivity extends Activity {
         ListView passList;
         private ArrayAdapter<String> listAdapter;
         private ArrayList<String> listStr;
 
        @Override
        public void onSaveInstanceState(Bundle savedInstanceState) {
          super.onSaveInstanceState(savedInstanceState);
          savedInstanceState.putStringArrayList("listStr", listStr);
        }
       
        @Override
        public void onRestoreInstanceState(Bundle savedInstanceState) {
          super.onRestoreInstanceState(savedInstanceState);
          listStr= savedInstanceState.getStringArrayList("listStr");
        }

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
 
                 listView = (ListView) findViewById(R.id.listView1);           
               
                // Copia il valore dell'ArrayList che viene salvato al cambio orientamento in un altro ArrayList
                listStr= new ArrayList<String>();
                ArrayList<String> ListP = new ArrayList<String>();
                ListP.addAll(listStr);

                Log.i("OnCreate: ", listStr);
               
                // Il nuovo arraylist viene utilizzato per creare l'adapter e setta la listview
                listAdapter = new ArrayAdapter<String>(this, R.layout.row, ListP);
                listView.setAdapter(listAdapter);

                // Al click sul bottone aggiunge una stringa alla lista
                bt1.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View v) {

                             String newP = ""+i; // un contatore
                             listStr.add(newP);
                             listAdapter.add(newP);
                             Log.i("bottone: ", listStr);
                       }
                });
}

Il problema è che nell'oncreate la lista risulta sempre vuota, non ostante i valori vengano salvati. Mentre nel listener del bottone i valori vengono salvati correttamente. Ma comunque nell'applicazione al cambio orientamento, la lista risulta sempre vuota:
07-22 22:10:44.210: I/System.out(23968): Oncreate: []
07-22 22:10:53.562: I/System.out(23968): bottone: [1]
07-22 22:10:53.562: I/System.out(23968): bottone: [1,2]
07-22 22:10:53.562: I/System.out(23968): bottone: [1,2,3]


Quindi, come posso salvare correttamente una lista di stringhe di una ListView al cambio d'orientamento del dispositivo ?
Grazie mille in anticipo  :D
Vincenzo Cimino @ Google Play Store


Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 717
  • Respect: +151
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Salvare un ArrayList al cambio orientamento
« Risposta #1 il: 23 Luglio 2014, 09:51:40 CEST »
+1
nell'onCreate, al posto di

Codice (Java): [Seleziona]
listStr= new ArrayList<String>();
prova a mettere

Codice (Java): [Seleziona]
if (listStr == null) {
  listStr= new ArrayList<String>();
}

Un'alternativa consiste nel togliere del tutto il metodo onRestoreInstanceState e fare il controllo nella onCreate:

Codice (Java): [Seleziona]
if (savedInstanceState != null && savedInstanceState.containsKey("listStr")) {
  listStr= new ArrayList<String>(savedInstanceState.getStringArray("listStr"));
} else {
  listStr= new ArrayList<String>();
}
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Re:Salvare un ArrayList al cambio orientamento
« Risposta #2 il: 23 Luglio 2014, 22:17:42 CEST »
0
Grazie mille !
Ho risolto, eliminando il metodo onRestoreInstanceState, e scrivendo così nell'Oncreate:

Codice (Java): [Seleziona]
if (savedInstanceState != null && savedInstanceState.containsKey("listStr")) {
                listStr = savedInstanceState.getStringArrayList("listStr");
} else {
        listStr= new ArrayList<String>();
}
« Ultima modifica: 23 Luglio 2014, 22:38:58 CEST da Vincenzoz »
Vincenzo Cimino @ Google Play Store


Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 717
  • Respect: +151
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Salvare un ArrayList al cambio orientamento
« Risposta #3 il: 23 Luglio 2014, 22:40:45 CEST »
0
Citazione
Codice (Java): [Seleziona]
listStr = savedInstanceState.getStringArrayList("listStr");

E' quello che intendevo, non ricordavo di preciso come tirar fuori un arraylist dal Bundle, ma il succo è quello.

Ciao!
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.