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?
Si sta utilizzando un pattern di osservatore per l'aggiornamento dei dati nell'elenco? –
Sì, sto usando lo schema dell'osservatore. – Peter
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 –