2016-03-14 15 views
5

Mam problemy z używaniem java.util.Observable w mojej aplikacji na Androida. W mojej aplikacji chcę zaktualizować listview, gdy dane zostaną zmienione w tle.Obserwator Androida nie aktualizuje obiektu w widoku listy

Obiekty z listview znajdują się w obserwatorze. Widzę je w klasie arraylist z klasy obserwatora. W Eclipse Debugging widzę odniesienie do mojego obiektów, na przykład: [email protected]

jednej rzeczy nie rozumiem: Po zmianie danych w moim sposobie aktualizacji obserwatora

@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); 

      } 
     } 
    } 

} 

Po setId nagle przedmiot ma inne odniesienie. Tak więc w moim listview nadal stare dane są przechowywane ze starym odniesieniem.

Mój kod w widoku:

@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 arraylist z danymi w adapter. Dane tutaj nie są zmieniane, ale dane powinny zostać zmienione z pierwszej metody.

Mój kod obserwatora jest:

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));   
}  

}

Co ja nie rozumiem: Obiekt w arraylist jest dodawany do obserwatora. Niektóre dane w obiekcie obserwatora zostają zmienione. Ale zmiany są tylko w obiekcie obserwatora, a nie w liście układów, którą dodałem do obserwatora. Myślałem, że w obserwatorze jest tylko odniesienie do mojego obiektu w arraylist? Tak więc obiekt w arraylist powinien również zmienić się, gdy obiekt w obserwatorze zostanie zmieniony. Ale to nie działa, dlaczego?

Czy ktoś może mi wyjaśnić, co się tutaj dzieje?

+0

Czy używasz wzorca obserwatora do aktualizacji danych na liście? –

+0

Tak, używam wzorca obserwatora. – Peter

+0

W tym celu można zaktualizować dane z listy i użyć metody notifydatasetchange, która będzie działać dokładnie tak, jak obserwator. http://developer.android.com/reference/android/widget/BaseAdapter.html –

Odpowiedz

2

Teraz dokonuję całego procesu aktualizacji z LocalBroadcasts, teraz mój problem został rozwiązany.

2

Po zmianie danych należy wywołać metodę poniżej.

Adapter niestandardowego adaptera = nowy CustomAdapter (YourActivity.this, dataSet); adapter.notifyDataSetChanged();

Tutaj powiadamia się adapter listy, że zestaw danych został zmieniony.

+0

Myślę, że to powinno działać, ale nie przetestowałem go samodzielnie –

+0

To będzie działać. Jeśli nie odpowiesz na to, rozwiążesz problem –

Powiązane problemy