2016-02-28 62 views
-1

我有扩展ListView的自定义视图。这个CustomListView有一个CustomHeaderView,代表ListView的头部。Android - 从嵌套视图取消注册观察者

一旦我创建/充气HeaderView我注册到抓取类。 现在我的问题是何时取消注册此视图。 当我旋转设备的意见是重建和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(); 
    } 
} 

CustomListView:

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

CustomHeaderView:

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); ?? 

} 

我得到我的观点注册,但我不知道在哪里可以注销它。当决定再次旋转注册视图。

+0

如果你投下了票,请在下面评论,它有什么问题。谢谢 – Bugdr0id

回答

1

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

0

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

+0

如果此视图需要更新多次,该怎么办? – Bugdr0id

+0

您可以在需要更改观察者时注册观察者,并在注册观察者时注销观察者。 –