observer.update();
上面的方法使观察者的可见性为“GONE”,但我想更改除发送者观察者之外的所有其他观察者。我怎么能控制它?
我的所有动作都是观察者,并在下面的构造函数中注册自己,
public class ParentAction extends AbstractAction implements IActionObserver{
private ArrayList<IAction> lSubItems;
private View subView;
public ParentAction( String ItemText,int drawable,ArrayList<IAction> SubItems) {
super(ItemText,drawable);
lSubItems = SubItems;
ActionHolder.getInstance().registerObserver(this);
}
@Override
public void update() {
getSubView().setVisibility(View.GONE);
} ...
ActionHolder
public class ActionHolder implements IActionSubject {
private static ActionHolder uniqueActionHolder;
private ArrayList observers;
private ActionHolder() {
observers = new ArrayList();
}
public static synchronized ActionHolder getInstance() {
if (uniqueActionHolder == null) {
uniqueActionHolder = new ActionHolder();
}
return uniqueActionHolder;
}
public void registerObserver(IActionObserver o) {
observers.add(o);
}
public void removeObserver(IActionObserver o) {
int i = observers.indexOf(o);
if (i >= 0) {
observers.remove(i);
}
}
public void notifyObserver() {
for (int i = 0; i < observers.size(); i++) {
IActionObserver observer = (IActionObserver) observers.get(i);
observer.update();
}
}
public void actionClicked(View view) {
notifyObserver();
}
}
答案 0 :(得分:3)
这是你自己的观察者模式的实现吗?如果是这样,您可以修改notify
方法,例如:
public void notifyObserver(IAction sender) {
for (int i = 0; i < observers.size(); i++) {
IActionObserver observer = (IActionObserver) observers.get(i);
if (observer != sender)
observer.update();
}
}
并将其命名为
ActionHolder.getInstance().notifyObserver(this);
或者,您可以在操作类中添加标记:
private bool sender = false;
在通知前设置标志:
sender = true;
ActionHolder.getInstance().notifyObserver();
并在update
:
@Override
public void update() {
if (!sender) {
getSubView().setVisibility(View.GONE);
}
sender = false;
}
答案 1 :(得分:1)
您在actionClicked
方法中引发事件,然后通知所有观察者。只需将引用传递给发件人观察者,以便稍后再刷新。
如果我的代码正确无误,您可以通过使用view
public void actionClicked(View view) {
notifyObserver(view);
}
public void notifyObserver(View view) {
for (int i = 0; i < observers.size(); i++) {
IActionObserver observer = (IActionObserver) observers.get(i);
observer.update(view);
}
}
而update
方法会跳过当前视图
@Override
public void update(View view) {
if (!getSubView().equals(view)) {
getSubView().setVisibility(View.GONE);
}
}