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?
Czy używasz wzorca obserwatora do aktualizacji danych na liście? –
Tak, używam wzorca obserwatora. – Peter
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 –