Android - 从嵌套视图中注销观察者
Android - Unregister observer from nested view
我有扩展 ListView 的自定义视图。这个 CustomListView 有一个 CustomHeaderView,代表 ListView 的 header。
一旦我 create/inflate 我将 HeaderView 注册到 Grabber class。
我现在的问题是什么时候注销这个视图。
当我旋转设备时,视图被重建并且 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); ??
}
我注册了我的视图,但我不知道在哪里取消注册。当决定再次旋转Registered中的视图时。
在更新方法结束时,您可以注销视图。
使用 activity/fragment 的生命周期方法来指示何时注销抓取器。
我有扩展 ListView 的自定义视图。这个 CustomListView 有一个 CustomHeaderView,代表 ListView 的 header。
一旦我 create/inflate 我将 HeaderView 注册到 Grabber class。 我现在的问题是什么时候注销这个视图。 当我旋转设备时,视图被重建并且 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); ??
}
我注册了我的视图,但我不知道在哪里取消注册。当决定再次旋转Registered中的视图时。
在更新方法结束时,您可以注销视图。
使用 activity/fragment 的生命周期方法来指示何时注销抓取器。