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?
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? –
Có, tôi đang sử dụng mẫu người quan sát. – Peter
Để 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 –