错误信息
cannot be cast to android.widget.HeaderViewListAdapter   
这个类型转换异常发生在ListView上,我复制别人的代码的ListView的时候,对他的代码做了一些修改,把他的HeadView去掉了,然后发生了这个错误,下面是根据日志找到的代码报错的地方:
HeaderViewListAdapter ha = (HeaderViewListAdapter) _list.getAdapter();   
在这个我不能将我的ListView配置的adapter转换成HeaderViewListAdapter,原因是我去掉了原来代码的addHeaderView,导致不能正常转换,解决办法就是恢复原来代码的addHeaderView或者不使用这个转换。
另外,如果你在ListView/setAadapter(adapter)之后再addHeaderView()或者addFooterView,那么在你ListView.removeHeaderView和ListView.removeFooterView之时也会报这个异常,所以我们一样要确保自己的addHeaderView(view)和addFooterView(view)方法是在ListView.setAdapter(adapter)之前执行,切记~
在使用 ListView 的 headerView 和 footerView 的过程中,如果需要实现显示与隐藏的功能,一般都是直接使addFooterView 和 removeFooterView,在4.4上是可以实现的,但是今天发现在4.0.4上会crash。
出现Error:cannot be cast to android.widget.HeaderViewListAdapter
这是由于在 setAdapter 之后调用了addFooterView 和 removeFooterView 方法。
在Listview的源码中可以看到,如果设置了adapter,那么它会强转成HeaderViewListAdapter,所以就会报错。
if (mAdapter != null && ((HeaderViewListAdapter) mAdapter).removeHeader(v)) {    
     if (mDataSetObserver != null) {    
         mDataSetObserver.onChanged();    
     }    
     result = true;    
}  
所以你一定要在setAdapter之前调用addFooterView 或removeFooterView .
还有个方法就是直接设置
this.footerLayout.setVisibility(View.GONE);  
但是你又会发现有问题,footerView 的内容虽然隐藏了,但是它仍然占有位置,就像设置View.INVISIBILE一样的效果。
网上大神给出了答案,只要给footerView再加上一个layout或者是父级的view就可以了。
RelativeLayout footerParent = new RelativeLayout(getContext());    
        RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);    
        rlp.addRule(RelativeLayout.CENTER_IN_PARENT);    
        footerParent.addView(footerLayout, rlp);    
        mListView.addFooterView(footerParent);    
        footerLayout.setVisibility(View.GONE);