4

观察者.更新();

上述方法使观察者的可见性“消失”,但我想更改除发送者观察者之外的所有其他观察者。我该如何控制这个?

我的所有动作都是观察者并在他们的构造函数中注册,如下所示,

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

行动持有人

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

}
4

2 回答 2

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;
}
于 2013-05-13T13:45:05.383 回答
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);
   }
}
于 2013-05-13T13:51:54.267 回答