【问题标题】:Android - Unregister observer from nested viewAndroid - 从嵌套视图中注销观察者
【发布时间】:2016-02-28 19:23:35
【问题描述】:

我有扩展 ListView 的自定义视图。这个 CustomListView 有一个代表 ListView 标题的 CustomHeaderView。

创建/扩充 HeaderView 后,我将其注册到 Grabber 类。 我现在的问题是何时取消注册此视图。 当我旋转设备时,视图被重建并且 CustomHeaderView 被再次注册(之前没有被取消注册)。

public class Grabber implements Subject {
    private static ArrayList<Observer> mObservers;
    private int mColor;

    private static Grabber instance;

    private BrandingColorGrabber() {}

    public static Grabber getInstance() {
        if (instance == null) {
            instance = new Grabber();
            mObservers = new ArrayList<>();
        }
        return instance;
    }

    @Override
    public void register(Observer newObserver) {
        mObservers.add(newObserver);
    }

    @Override
    public void unRegister(Observer deleteObserver) {
        mObservers.remove(deleteObserver);
    }

    @Override
    public void notifyObserver() {
        for (Observer currObserver : mObservers) {
            currObserver.update(mBrandingColor);
        }
    }

    public void setColor(int color) {
        this.mColor = color;
        notifyObserver();
    }
}

自定义列表视图:

public class CustomListView extends ListView {
     ...
    private void initHeader(){
        mCustomHeaderView = new CustomHeaderView(getContext());
        mCustomHeaderView.buildHeader(this, getContext());
        this.addHeaderView(mDrawerHeader);
    }
}

自定义标题视图:

public class CustomHeaderView extends FrameLayout implements Observer{

 private BrandingColorGrabber brandingColorGrabber; 
 //other vars

public CustomHeaderView(Context context) {
    super(context);
    if(!isInEditMode())
    init(context);
}

public CustomHeaderView(Context context, AttributeSet attrs) {
    super(context, attrs);
    if(!isInEditMode())
        init(context);
}

public CustomHeaderView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    if(!isInEditMode())
        init(context);
}

private void init(Context context) {
    grabber = Grabber.getInstance();
    grabber.register(this);
    Log.e("TAG","register header");
}

@Override
public void update(int color) {
    view1.setBackgroundColor(color);
    view2.setBackgroundColor(color);
}

// ---->>>> Where to unregister this view?? where to call grabber.unregister(this); ??

}

我注册了我的视图,但我不知道在哪里取消注册。当决定再次旋转注册中的视图时。

【问题讨论】:

  • 如果你投反对票,请在下面评论,有什么问题。谢谢

标签: android listview observer-pattern


【解决方案1】:

使用活动/片段的生命周期方法来指示何时取消注册抓取器。

【讨论】:

    【解决方案2】:

    在更新方法结束时,您可以取消注册视图。

    【讨论】:

    • 如果这个视图需要多次更新怎么办?
    • 您可以在需要更改时注册观察者,在更改时可以取消注册。
    猜你喜欢
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多