2016-03-14 17 views
5

Tôi gặp sự cố khi sử dụng java.util.Observable trong ứng dụng Android của mình. Trong ứng dụng của tôi, tôi muốn cập nhật một listview khi dữ liệu được thay đổi ở chế độ nền.Người quan sát Android không cập nhật đối tượng trong listview

Vì vậy, các đối tượng từ listview có trong người quan sát. Tôi thấy chúng trong số arraylist từ lớp người quan sát. Trong Eclipse Debugging tôi thấy tham chiếu đến đối tượng của tôi, ví dụ: [email protected]

Một điều tôi không hiểu: Khi dữ liệu được thay đổi trong phương pháp cập nhật quan sát của tôi

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

      } 
     } 
    } 

} 

Sau setId, đột nhiên đối tượng có một tham chiếu khác. Vì vậy, trong listview của tôi, dữ liệu cũ vẫn được lưu trữ với tham chiếu cũ.

Mã của tôi trong giao diện:

@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 các arraylist với dữ liệu trong adapter. Dữ liệu ở đây không thay đổi, nhưng dữ liệu phải được thay đổi từ phương thức đầu tiên.

Mã của tôi của người quan sát là:

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

}

Những gì tôi không hiểu là: Các đối tượng trong arraylist được thêm vào người quan sát. Một số dữ liệu trong đối tượng quan sát được thay đổi. Nhưng những thay đổi chỉ trong đối tượng của người quan sát, không phải trong danh sách mà tôi đã thêm vào người quan sát. Tôi nghĩ rằng trong người quan sát có chỉ là một tham chiếu đến đối tượng của tôi trong arraylist? Vì vậy, đối tượng trong các arraylist cũng nên thay đổi khi đối tượng trong người quan sát được thay đổi. Nhưng điều này không hiệu quả, tại sao?

Có ai có thể giải thích cho tôi điều gì đang xảy ra ở đây không?

+0

Bạn có đang sử dụng mẫu quan sát để cập nhật dữ liệu trong danh sách của mình không? –

+0

Có, tôi đang sử dụng mẫu người quan sát. – Peter

+0

Để bạn có thể cập nhật dữ liệu danh sách của mình và sử dụng phương thức notifydatasetchange sẽ hoạt động chính xác như người quan sát. http://developer.android.com/reference/android/widget/BaseAdapter.html –

Trả lời

2

Tôi bây giờ làm cho toàn bộ quá trình cập nhật với LocalBroadcasts, bây giờ vấn đề của tôi được giải quyết.

2

Khi thay đổi dữ liệu của bạn gọi phương thức dưới đây.

Bộ điều hợp CustomAdapter = new CustomAdapter (YourActivity.this, dataSet); adapter.notifyDataSetChanged();

Tại đây bạn thông báo cho bộ điều hợp danh sách mà dataSet đã được thay đổi.

+0

Tôi nghĩ rằng điều này sẽ làm việc nhưng tôi đã không kiểm tra nó bản thân mình –

+0

Nó sẽ làm việc. Nếu không trả lời câu hỏi này sẽ giải quyết được vấn đề –

Các vấn đề liên quan