报错: cannot be cast to android.widget.HeaderViewListAdapter

作者: wxyass 分类: Android 发布时间: 2017-09-21 15:55

错误信息

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);  

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注