4

オブザーバー.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);
    }  ...

アクションホルダー

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 に答える