手写观察者
Android 开发中遇到登录前后界面展示不同的情况,要怎么处理界面的变化呢?
有两种方法:
- 每次打开抽屉的时候做判断
- 每次登录状态改变的时候做判断
每次打开抽屉的时候做判断
- 判断的次数多
- 代码结构简单
drawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() {
boolean isClosed = true;
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
isClosed = false;
}
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
isClosed = true;
}
@Override
public void onDrawerStateChanged(int newState) {
super.onDrawerStateChanged(newState);
if (isClosed && (newState == DrawerLayout.STATE_DRAGGING || newState == DrawerLayout.STATE_SETTLING)) {
boolean isLogged = ((App) getApplication()).isLogged();
drawerItems.clear();
drawerItems.addAll(DrawerItem.getItems(isLogged));
drawerAdapter.notifyDataSetChanged();
}
}
});
每次登录状态改变的时候做判断
- 判断的次数少
- 结构复杂些
MainActivity.java 中
//每次登录状态改变后, 改变drawer 中展示的内容
((App) getApplication()).setOnLoginStateChangeListener(new App.OnLoginStateChangeListener() {
@Override
public void onChange(User user) {
drawerItems.clear();
drawerItems.addAll(DrawerItem.getItems(user != null));
drawerAdapter.notifyDataSetChanged();
}
});
App.java 中
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
if (onLoginStateChangeListener != null) {
onLoginStateChangeListener.onChange(user);
}
}
private OnLoginStateChangeListener onLoginStateChangeListener;
public void setOnLoginStateChangeListener(OnLoginStateChangeListener listener) {
this.onLoginStateChangeListener = listener;
}
public interface OnLoginStateChangeListener {
void onChange(User user);
}