2009-03-16 10 views
14
  1. Mi piace che la mia GUI venga visualizzata immediatamente quando l'utente avvia l'app.
  2. Quindi alcuni dati (testo, immagini) vengono caricati in background (come l'app YouTube).
  3. ListView e Gallery vengono aggiornati automaticamente con questi nuovi dati.

Avvio il mio ListView, avviare un thread e caricare i dati ... e quindi il ListView non viene aggiornato! Diverse persone mi hanno detto che dovrei usare notifyDataSetChanged(). Ma non posso inserire questo comando nel mio Thread (solo sconosciuto).Android: Aggiorna Listview dopo Thread carica i dati dalla rete

Qualche idea?

risposta

19

Ho lo stesso problema ... e mi sono emozionato quando ho trovato questa domanda. Ma nessuna risposta? :-(

Dopo, lasciando che il problema riposare per circa due settimane ho trovato il solution here:

Per farla breve:

Citazione dall'alto link:

We must use a Handler object because we cannot update most UI objects while in a separate thread. When we send a message to the Handler it will get saved into a queue and get executed by the UI thread as soon as possible.

Una volta che si estrae il codice che vedi riceve ciò che dice l'autore
NOTA: anche con un gestore, Android potrebbe non consentire di aggiornare un oggetto vista dal metodo run() del thread. Ho ricevuto questo errore:

05-31 02:12:17.064: ERROR/AndroidRuntime(881): 
android.view.ViewRoot$CalledFromWrongThreadException: 
Only the original thread that created a view hierarchy can touch its views. 

Per aggirare l'ostacolo Ho aggiornato una serie di dati in mio metodo run() e utilizzato tale matrice per aggiornare la visualizzazione in modalità handleMessage() del conduttore.

Spero che questo aiuti gli altri là fuori.

4

È possibile utilizzare lo slowAdapter per aggiornare la visualizzazione:

SlowAdapter = new SlowAdapter(this); 

list.setAdapter(SlowAdapter); 
SlowAdapter.notifyDataSetChanged(); 
3

appena trovato io stesso durante la lettura questa discussione e cercando in giro.

breve: AsyncTask 's metodo onProgressUpdate può toccare la vista: http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress...)

Background: avevo bisogno di chiamare Requery sul mio cursore in modo un controllo ListView mantenuto aggiornato mentre il compito riempie il database. La chiamata di richiesta effettuata in doInBackground non è riuscita con il menzionato CalledFromWrongThreadException ma lo stesso codice in suProgressUpdate funziona.

Problemi correlati