首页 > 代码库 > addHeader和removeHeader之间切换时候,出现程序崩溃

addHeader和removeHeader之间切换时候,出现程序崩溃













在做项目的时候,遇到了一个问题。问题过程我在此叙述一遍:在未登录的时候,在好友动态的页面(整个动态的列表使用的是listview)会显示一个头部布局用于提示用于进行登陆;当用户登陆过后,该头部布局则会消失。

然后,在我进行调试的时候,出现了崩溃现象!我是这样进行调试的:首先进入该页面,点击登陆按钮进行登陆。登陆之后,到注销账号页面注销登陆账号。然后再回到这个好友动态页面。然后,问题出现了!报:"Cannot add header view to list -- setAdapter has already been called . " 那该怎么解决这个问题呢?先了解一下listview的setadapter源码是怎么运行的。

public void addHeaderView(View v, Object data, boolean isSelectable) {
 
  if (mAdapter != null && ! (mAdapter instanceof HeaderViewListAdapter)) {
      throw new IllegalStateException(
        "Cannot add header view to list -- setAdapter has already been called.");
  }
 
  FixedViewInfo info = new FixedViewInfo();
  info.view = v;
  info.data = http://www.mamicode.com/data;>有上面的代码,我们大致可以理解。当listview已经setadapter之后(或者之前已经setadapter,第二次操作addheader),再给listview  addheader的时候。根据上面的源码,mAdapter != null  了已经,因此会报错!所有,我们可以重置mAdapter对象。在listview调用addheader方法之前我们就先使用“listView.setAdapter(null);”之后对listview添加头部就行了。我的代码是这样写的:
@Override
	public void onStart() {
		super.onStart();
		if(TextUtils.isEmpty(SharedPreferenceMemoryUtil.getToken(getActivity()))){
			listView.setAdapter(null);//解决冲突bug
			if(!hasHeader){
				listView.addHeaderView(headView);
			}else{
				listView.addHeaderView(headView);
			}
			hasHeader = true;
		}else{
			if(hasHeader){
				listView.removeHeaderView(headView);
				hasHeader = false;
			}
		}
		requestMethod();
		initBroadCastMethod();
	}
然后,链接一下类似问题朋友的解决方法!


addHeader和removeHeader之间切换时候,出现程序崩溃