Ich habe Probleme mit java.util.Observable
in meiner Android-Anwendung. In meiner App möchte ich eine listview
aktualisieren, wenn die Daten im Hintergrund geändert werden.Android Observer aktualisiert das Objekt in Listview
So sind die Objekte aus der listview
im Beobachter. Ich sehe sie in der arraylist
aus der Beobachterklasse. In Eclipse-Debugging sehe ich den Verweis auf meine Objekte, zum Beispiel: [email protected]
Eine Sache, die ich nicht verstehe: Wenn die Daten in meiner Beobachter Aktualisierungsmethode geändert werden
@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);
}
}
}
}
Nach setId, plötzlich das Objekt hat eine andere Referenz. Also in meinem listview
werden immer noch die alten Daten mit der alten Referenz gespeichert.
Mein Code in der Ansicht:
@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 die arraylist
mit Daten in der adapter
. Die Daten werden hier nicht geändert, aber die Daten sollten von der ersten Methode geändert werden.
Mein Code des Beobachters ist:
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));
}
}
Was ich nicht verstehe, ist: Das Objekt in den arraylist
den Beobachter hinzugefügt wird. Einige Daten im Observer-Objekt werden geändert. Aber die Veränderungen sind nur im Objekt des Beobachters, nicht in der Arraylist, die ich dem Beobachter hinzugefügt habe. Ich dachte, dass es im Beobachter nur einen Verweis auf mein Objekt in der arraylist
gibt? Das Objekt in der arraylist
sollte sich also auch ändern, wenn das Objekt im Beobachter geändert wird. Aber das funktioniert nicht, warum?
Kann mir jemand erklären, was hier passiert?
Verwenden Sie Beobachtermuster zum Aktualisieren von Daten in Ihrer Liste? –
Ja, ich benutze das Beobachtermuster. – Peter
Dafür können Sie Ihre Listendaten aktualisieren und notifydatasetchange-Methode verwenden, die genau als Beobachter funktioniert. http://developer.android.com/reference/android/widget/BaseAdapter.html –