2016-03-14 8 views
5

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?

+0

Verwenden Sie Beobachtermuster zum Aktualisieren von Daten in Ihrer Liste? –

+0

Ja, ich benutze das Beobachtermuster. – Peter

+0

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 –

Antwort

2

Ich mache jetzt den ganzen Update-Prozess mit LocalBroadcasts, jetzt ist mein Problem gelöst.

2

Sobald sich Ihre Daten geändert haben, rufen Sie die Balgmethode auf.

CustomAdapter-Adapter = neuer CustomAdapter (YourActivity.this, dataSet); adapter.notifyDataSetChanged();

Hier notieren Sie dem Listenadapter, dass dataSet geändert wurde.

+0

aufruft Ich denke, das sollte funktionieren, aber ich habe es nicht selbst getestet –

+0

Es wird funktionieren. Wenn Sie darauf nicht antworten, wird das Problem gelöst –

Verwandte Themen