2011-12-29 12 views
22

Creare una discussione per aggiornare i miei dati e provare a fare notifyDataSetChanged al mio ListView.Come utilizzare notifyDataSetChanged() nella discussione

private class ReceiverThread extends Thread { 

@Override 
public void run() { 
    //up-to-date 
    mAdapter.notifyDataSetChanged(); 
} 

l'errore si verifica alla riga:

mAdapter.notifyDataSetChanged(); 

errore:

12-29 16: 44: 39,946: E/AndroidRuntime (9026): android.view. ViewRoot $ CalledFromWrongThreadException: solo il thread originale che ha creato una gerarchia di viste può toccare le sue viste.

Come si modifica?

risposta

41

Usa runOnUiThread() metodo per eseguire l'azione di interfaccia utente da un thread non-UI.

private class ReceiverThread extends Thread { 
@Override 
public void run() { 
Activity_name.this.runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      mAdapter.notifyDataSetChanged(); 
     } 
    }); 
} 
+0

Grazie ... Funziona perfettamente per me –

+0

Grazie.Molto bene ... –

4

Non è possibile accedere al thread UI da altro thread. È necessario utilizzare il gestore per eseguire questa operazione. È possibile inviare un messaggio al gestore all'interno del metodo di esecuzione e aggiornare l'interfaccia utente (chiamare mAdapter.notifyDataSetChanged()) all'interno del gestore.

5

Non è possibile toccare le visualizzazioni dell'interfaccia utente da altro thread. Per il tuo problema puoi utilizzare AsyncTask, runOnUiThread o gestore.

All The Best

1

access the UI thread from other threads

Activity.runOnUiThread (Runnable)

View.post (Runnable)

View.postDelayed (Runnable, lungo)

mio approccio uso altri thread per lavoro:

private AbsListView _boundedView; 
private BasicAdapter _syncAdapter; 

/** bind view to adapter */ 
public void bindViewToSearchAdapter(AbsListView view) { 
    _boundedView = view; 
    _boundedView.setAdapter(_syncAdapter); 
} 

/** update view on UI Thread */ 
public void updateBoundedView() { 
    if(_boundedView!=null) { 
     _boundedView.post(new Runnable() { 
      @Override 
      public void run() { 
       if (_syncAdapter != null) { 
        _syncAdapter.notifyDataSetChanged(); 
       } 
      } 
     }); 
    } 
} 

btw notifyDatasetChanged() metodo ganci per oggetto classe DataSetObservable di AbsListView che è impostato prima coinvolgendo metodo AbsListView.setAdaptert (Adapter) impostando callback per Adapter.registerDataSetObserver (DataSetObserver);

Problemi correlati