Android 观察者没有更新列表视图中的对象
Android observer is not updating object in listview
我在 android 应用程序中使用 java.util.Observable
时遇到问题。
在我的应用程序中,我想在后台更改数据时更新 listview
。
所以来自 listview
的对象在观察者中。我在观察者 class 的 arraylist
中看到了它们。在 Eclipse 调试中,我看到了对我的对象的引用,例如:at.stockserv.todo.Todo@1a3f2cb7
有一件事我不明白:当我的观察者更新方法中的数据发生变化时
@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);
}
}
}
}
setId后,突然对象又多了一个引用。所以在我的 listview
中,旧数据仍然与旧引用一起存储。
我在视图中的代码:
@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
是 arraylist
,数据在 adapter
中。这里的数据没有改变,但是数据应该从第一种方法开始改变。
我的观察者代码是:
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));
}
}
我不明白的是:
arraylist
中的对象被添加到观察者中。观察者对象中的某些数据已更改。但是变化只是在观察者的对象中,而不是在我添加到观察者的arraylist中。我认为在观察者中只有 arraylist
中对我的对象的引用?因此,当观察者中的对象发生变化时,arraylist
中的对象也应该发生变化。但这不起作用,为什么?
谁能给我解释一下这里发生了什么?
一旦您的数据发生变化,请调用以下方法。
CustomAdapter 适配器 = new CustomAdapter(YourActivity.this, dataSet);
adapter.notifyDataSetChanged();
在这里通知列表适配器数据集已更改。
我现在用LocalBroadcasts完成整个更新过程,现在我的问题已经解决了。
我在 android 应用程序中使用 java.util.Observable
时遇到问题。
在我的应用程序中,我想在后台更改数据时更新 listview
。
所以来自 listview
的对象在观察者中。我在观察者 class 的 arraylist
中看到了它们。在 Eclipse 调试中,我看到了对我的对象的引用,例如:at.stockserv.todo.Todo@1a3f2cb7
有一件事我不明白:当我的观察者更新方法中的数据发生变化时
@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);
}
}
}
}
setId后,突然对象又多了一个引用。所以在我的 listview
中,旧数据仍然与旧引用一起存储。
我在视图中的代码:
@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
是 arraylist
,数据在 adapter
中。这里的数据没有改变,但是数据应该从第一种方法开始改变。
我的观察者代码是:
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));
}
}
我不明白的是:
arraylist
中的对象被添加到观察者中。观察者对象中的某些数据已更改。但是变化只是在观察者的对象中,而不是在我添加到观察者的arraylist中。我认为在观察者中只有 arraylist
中对我的对象的引用?因此,当观察者中的对象发生变化时,arraylist
中的对象也应该发生变化。但这不起作用,为什么?
谁能给我解释一下这里发生了什么?
一旦您的数据发生变化,请调用以下方法。
CustomAdapter 适配器 = new CustomAdapter(YourActivity.this, dataSet); adapter.notifyDataSetChanged();
在这里通知列表适配器数据集已更改。
我现在用LocalBroadcasts完成整个更新过程,现在我的问题已经解决了。