Ho un problema semi-complicato e spero che qualcuno qui sarà in grado di aiutarmi.Android: notifyDataSetChanged() non sta aggiornando listview dopo il cambio di orientamento
In un evento click, creo un thread e avvio un'operazione di lunga durata basata sul metodo this. Dopo che il compito a lungo in esecuzione è completata, si fa un richiamo a un altro metodo, che fa un post al gestore:
@Override
public void contentSearchModelChanged(Model_ContentSearch csm, ArrayList<Class_Reminder> newRemindersList) {
remindersList = newRemindersList;
mHandler.post(mUpdateDisplayRunnable);
}
che chiama un Runnable:
// post this to the Handler when the background thread completes
private final Runnable mUpdateDisplayRunnable = new Runnable() {
public void run() {
updateDisplay();
}
};
Infine, ecco è ciò che il mio metodo updateDisplay() sta facendo:
private void updateDisplay() {
if (csModel.getState() != Model_ContentSearch.State.RUNNING) {
if(remindersList != null && remindersList.size() > 0){
r_adapter = new ReminderAdapater(Activity_ContentSearch.this, remindersList, thisListView);
thisListView.setAdapter(r_adapter);
r_adapter.notifyDataSetChanged();
}
}
}
Questo funziona magnificamente quando lo faccio normalmente. Tuttavia, se cambio l'orientamento mentre è in esecuzione l'operazione di lunga durata, non funziona. Rende correttamente la callback e la lista dei promemoria contiene degli elementi. Ma quando arriva a questa riga:
r_adapter.notifyDataSetChanged();
Non succede nulla. La cosa strana è che se faccio un altro invio e lo faccio eseguire di nuovo l'intero processo (senza cambiare orientamento), in realtà aggiorna la vista due volte, una volta per l'invio precedente e ancora per il successivo. Quindi la vista si aggiorna una volta con i risultati del primo invio, poi di nuovo con i risultati del secondo invio un secondo dopo. Quindi l'adattatore DID ottiene i dati, semplicemente non aggiorna la vista.
So che questo ha qualcosa a che fare con il cambiamento di orientamento, ma non posso per la vita di me capire perché. Qualcuno può aiutare? Oppure, qualcuno può suggerire un metodo alternativo per gestire i thread con i cambiamenti di orientamento?
Bara
Hmm ... sembra molto utile, ma non sembra esserci molta documentazione? Mi dispiacerebbe cambiare la mia implementazione all'uso di DroidFu e non sapere come risolvere un problema perché non è il modo "tipico" di fare le cose. – Bara
Sì, sembra essere una vecchia biblioteca abbandonata ma la premessa sembra sana. Puoi farlo senza usare la libreria. Fondamentalmente l'oggetto Application tiene traccia dell'attività attiva (usando onResume). Quindi, quando si è pronti a notificare l'adattatore, si ottiene l'attività attiva dall'applicazione, verificare se si tratta di un'istanza dell'attività prevista e, in tal caso, trasmettere e notificare. –
Qual è esattamente il codice per tracciare la "Attività attiva"? Cioè, dovrei fare qualcosa come CurrentActivity act = new CurrentActivity(); quindi passare atto alla classe Application? – Bara