2016-03-14 14 views
5

Sto riscontrando problemi nell'utilizzo di java.util.Observable nella mia applicazione Android. Nella mia app, voglio aggiornare un listview quando i dati sono cambiati in background.L'osservatore Android non sta aggiornando l'oggetto in listview

Quindi gli oggetti da listview sono nell'osservatore. Li vedo nello arraylist della classe observer. In Eclipse debug vedo il riferimento ai miei oggetti, ad esempio: [email protected]

Una cosa che non capisco: Quando i dati sono cambiato nel mio metodo di aggiornamento osservatore

@Override 
public void update(Observable observable, Object data) {   
    if (observable instanceof DBObjectUpdateObserver) {   
     ObserverMessage message = (ObserverMessage) data;   
     if (message.getAction() == Actions.messageIdChanged) { 
      if (message.getData().get("oldId").equals(Integer.valueOf(getId()))) { 
       setId((Integer) message.getData().get("newId")); 
       DBObjectUpdateObserver.getInstance().dataHasChanged(this); 

      } 
     } 
    } 

} 

Dopo setId, improvvisamente l'oggetto ha un altro riferimento. Quindi nel mio listview, ancora i vecchi dati sono memorizzati con il vecchio riferimento.

Il mio codice nella visualizzazione:

@Override 
public void update(Observable observable, Object data) {   
    ObserverMessage message = (ObserverMessage) data; 
    if (message.getAction() == Actions.messageDBDataChanged) {   
     if (actNotices.contains(message.getData().get("dbObject"))) {    
      notifyDataSetChanged();    
      Toast.makeText(getApplicationContext(), "Data is updated ", Toast.LENGTH_LONG).show();    
     }   
    } 

} 

actNotices ist il arraylist con i dati del adapter. I dati non sono cambiati, ma i dati dovrebbero essere modificati dal primo metodo.

Il mio codice dell'osservatore è:

public class DBObjectUpdateObserver extends Observable { 

private static DBObjectUpdateObserver instance = new DBObjectUpdateObserver(); 

public static DBObjectUpdateObserver getInstance() { 
     return instance; 
} 

private DBObjectUpdateObserver() { 

} 

public void updateId (DBCommunicator dbObject, int oldId, int newId) { 
    HashMap<String, Object> data = new HashMap<String, Object>(); 
    data.put("oldId", oldId); 
    data.put("newId", newId); 
    data.put("dbObject", dbObject); 
    getInstance().setChanged(); 
    getInstance().notifyObservers(new ObserverMessage(Actions.messageIdChanged, data));   

} 

public void dataHasChanged(DBCommunicator dbObject, int oldId, int newId) { 
    HashMap<String, Object> data = new HashMap<String, Object>();  
    data.put("dbObject", dbObject); 
    data.put("oldId", oldId); 
    data.put("newId", newId); 
    getInstance().setChanged(); 
    getInstance().notifyObservers(new ObserverMessage(Actions.messageDBDataChanged, data));   
}  

}

Quello che non capisco è: L'oggetto nel arraylist viene aggiunto per l'osservatore. Alcuni dati nell'oggetto Observer sono cambiati. Ma i cambiamenti sono solo nell'oggetto dell'osservatore, non nell'arrayilista che ho aggiunto all'osservatore. Ho pensato che nell'osservatore ci fosse solo un riferimento al mio oggetto nello arraylist? Quindi l'oggetto nel arraylist dovrebbe cambiare anche quando l'oggetto nell'osservatore viene modificato. Ma questo non funziona, perché?

Qualcuno può spiegarmi cosa sta succedendo qui?

+0

Si sta utilizzando un pattern di osservatore per l'aggiornamento dei dati nell'elenco? –

+0

Sì, sto usando lo schema dell'osservatore. – Peter

+0

Per questo è possibile aggiornare i dati della lista e utilizzare il metodo notifydatasetchange che funzionerà esattamente come osservatore. http://developer.android.com/reference/android/widget/BaseAdapter.html –

risposta

2

Ora eseguo l'intero processo di aggiornamento con LocalBroadcasts, ora il mio problema è risolto.

2

Dopo aver modificato i dati, chiamare il metodo qui sotto.

Adattatore dell'adattatore personalizzato = nuovo CustomAdapter (YourActivity.this, dataSet); adapter.notifyDataSetChanged();

Qui si notifica l'adattatore di elenco che dataSet è stato modificato.

+0

Penso che questo dovrebbe funzionare ma non l'ho ancora testato io stesso –

+0

Funzionerà. Se non rispondi a questo risolvi il problema –

Problemi correlati