标签:addheader和removehead 出现程序崩溃
在做项目的时候,遇到了一个问题。问题过程我在此叙述一遍:在未登录的时候,在好友动态的页面(整个动态的列表使用的是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 = data; info.isSelectable = isSelectable; mHeaderViewInfos.add(info); // in the case of re-adding a header view, or adding one later on, // we need to notify the observer if (mAdapter != null && mDataSetObserver != null) { mDataSetObserver.onChanged(); } }有上面的代码,我们大致可以理解。当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之间切换时候,出现程序崩溃
标签:addheader和removehead 出现程序崩溃
原文地址:http://blog.csdn.net/junhuahouse/article/details/41344335