Android观察者未在listview

时间:2016-03-14 08:38:20

标签: android observer-pattern

我在Android应用程序中使用java.util.Observable时遇到了麻烦。 在我的应用中,我想在后台更改数据时更新listview

所以来自listview的对象在观察者中。我在观察者类的arraylist中看到它们。在Eclipse Debugging中,我看到了对象的引用,例如: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();              
        }           
    }

}

actNoticesarraylist中的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中的对象也应该发生变化。但这不起作用,为什么?

有谁能解释一下这里发生了什么?

2 个答案:

答案 0 :(得分:2)

数据更改后,请调用波纹管方法。

CustomAdapter adapter = new CustomAdapter(YourActivity.this,dataSet);  adapter.notifyDataSetChanged();

这里通知列表适配器dataSet已被更改。

答案 1 :(得分:2)

我现在使用LocalBroadcasts进行整个更新过程,现在我的问题解决了。