2012-08-29 14 views
8

Sul mio layout, ho alcuni pulsanti che fanno alcune scelte e quindi un pulsante per eseguire una query su un database. Il risultato di questa query è mostrato in un ListView all'interno di questo layout.Android listview scompare dopo la rotazione dello schermo

Il problema è se dopo aver eseguito la query ruoto lo schermo, lo ListView scompare e si deve eseguire nuovamente la query.

Credo che questo stia succedendo perché l'attività ricomincia. Seguendo i suggerimenti here ho aggiunto alla mia attività nel manifesto android:configChanges="orientation|keyboardHidden" e nel mio codice ha aggiunto:

@Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     setContentView(R.layout.mylayout); 

    } 

Ma questo non sta funzionando.

Ecco il codice completo della mia attività:

public class MyClass extends ListActivity implements OnClickListener, OnCheckedChangeListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mylayout); 

     // Creates the buttons and setOnClickListener and setOnCheckedChangeListener 
    } 

    @Override 
    public void onClick(View v) { 

     // Manages the buttons and their functions 

    @Override 
    public void onCheckedChanged(RadioGroup group, int checkedId) { 
     // See what group in radio group is checked 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     // After pressing one button, a query is made and a listview is shown. 
     // This it to handle the user choice after he clicks an item on the listview 

    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     setContentView(R.layout.mylayout); 

    } 
} 

Questo è strano perché ho qualche altra attività in questo modo:

public class AtoZ extends ListActivity { 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.atoz); 



    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     // TODO Auto-generated method stub 
     super.onListItemClick(l, v, position, id); 

    } 

} 

Questo esegue anche una query al database, lo mostra su un ListView e quindi gestisce la scelta dell'utente. Se ruoto lo schermo, viene visualizzato ancora ListView.

Cosa posso fare?

+0

Perché si imposta il layout su R.layout.nutrient nel metodo onConfigurationChanged (invece di R.layout.mylayout come fatto nel metodo onCreate)? – Sameer

+0

@Sameer Hai dimenticato di cambiare. Corretto – Favolas

+0

Come si inseriscono i dati in ListView? Lo si lega al cursore DB? – Sameer

risposta

3

Il ListView viene ricreato quando si imposta setContentView nel metodo onConfigurationChanged. È necessario caricare nuovamente i dati in ListView. se si esegue il binding di ListView a un adattatore, è necessario farlo in onConfigurationChanged.

+0

in base al tuo commento, è necessario salvare cursorAdapter come membro della classe probabilmente, in modo che possa essere associato a onConfigurationChanged. – Sameer

+0

Fatto e non è successo nulla. Trovato una cosa strana. in 'public void onConfigurationChanged (Configuration newConfig)' digitato 'System.out.println (" inserisci qui ");' Non è stampato su logcat – Favolas

+0

Leggi questo: ... Per ogni tipo di modifica della configurazione che dici che gestisci lì, riceverai una chiamata al metodo 'onConfigurationChanged (Configuration)' della tua attività corrente invece di essere riavviato.Se una modifica alla configurazione coinvolge qualcosa che non si gestisce, tuttavia, l'attività verrà comunque riavviata e 'onConfigurationChanged (Configuration)' non verrà chiamato. Da: [Pagina di sviluppo attività] (http://developer.android.com/reference/android/app/Activity.html) –

-1

È necessario ripetere la query (se non la si salva) quando si esegue un cambiamento di orientamento, poiché quando ciò viene eseguito, oncreate viene chiamato di nuovo.

Si potrebbe provare e memorizzare i dati che sono nella vostra listview, in qualcosa di simile a preferenze condivise.

+0

Grazie, ma Wy devo farlo in questo caso e nella classe 'AtoZ', che è quasi la stessa cosa, io no? – Favolas

5

Ci sono 2 cose possono risolvere i vostri problemi:

Risolutore A:

  1. Aggiungiandroid:configChanges="orientation|keyboardHidden" nel vostro manifest XML file.
  2. REMOVEonConfigurationChanged(Configuration newConfig) funzione.

Perché onCreate() viene chiamato solo una volta ogni volta che l'attività viene inizializzata. Mentre il tuo ricarica e gonfia la nuova vista R.layout.mylayout con dati vuoti => il tuo elenco non vincolerà con i dati.

Risolutore B:

Spostare i dati codice vincolante che erano stati scritti in onCreate() al il metodo predominante onStart() o onResume(). Ti consiglio di utilizzare onStart() per il tuo caso di associazione dei dati.

Si dovrebbe vedere la Develop pagina Android Activity life cycle

(Aggiornamento):

Perché si carica il listContent facendo clic su un pulsante di ricerca sulla voce della lista, in modo da avere per mantenere i dati all'interno di attività per la ricostruzione la lista da essa (per esempio: una stringa di ricerca). Quindi nello onStart() ricostruisci il tuo elenco da questi dati.

Tuttavia, è piuttosto strano della tua logica quando fai clic su un elemento di Elenco per modificare l'intero Elenco stesso. E notare che: onListItemClick(..) si attiva anche quando si fa clic su un pulsante sulla voce di elenco.

+0

non ha funzionato né il solutore b. Metti tutto il mio codice all'interno di 'onStart()' e dopo la rotazione, sempre lo stesso – Favolas

+0

Hai chiamato 'super.onListItemClick (l, v, position, id);' nel tuo metodo di sovrascrittura 'protected void onListItemClick (..)' ? –

+1

si può vedere di più per la soluzione a: [setRetainInstance] (http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance%28boolean%29) –

2

È necessario eseguire l'override onSaveInstanceState e onRestoreInstanceState

Sulla onSaveInstanceState salvare l'elenco ListView sul Bundle.

Sul onRestoreInstanceState, ripristinare l'elenco con Bundle e ricreare l'adattatore.

private ArrayList<String> data; 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    outState.putSerializable("d", data); 
    super.onSaveInstanceState(outState); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    if (savedInstanceState != null) { 
     data = (ArrayList<String>) savedInstanceState.getSerializable("d"); 
     ListViewAdapter adapter = new ListViewAdapter(this, data); 
     ListView listView = (ListView) findViewById(R.id.layout_listview); 
     listView.setAdapter(adapter); 
    } 
    super.onRestoreInstanceState(savedInstanceState); 
} 
7

Utilizzare configChanges nella propria attività nel file manifest.

<activity 
... 
... 
android:configChanges="orientation|screenSize|keyboard"> 
</activity 

Questo ha funzionato per me.

+2

solo questi 2 hanno funzionato per me: orientation | screenSize – usman

Problemi correlati