ListView添加HeaderView出现Cannot add header view to list -- setAdapter has already been called.

今天项目由于需要根据动态数据来控制ListView的头部,但在4.2系统出现如下异常:

java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called. at android.widget.ListView.addHeaderView(ListView.java:264)

分析4.2的源码如下:4.2的ListView需要在setAdapter之前调用addHeaderView,否则会出现异常。

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

那么对于需要根据数据来动态控制是否addHeaderView,需要怎么办呢?可以通过控制HeaderView的Visiable属性进行控制。初始化就加载HeaderView,设置为GONE。然后根据

数据动态控制,这里需要注意如果HeaderView的布局有2层以上,需要拿到第二层的layout去设置Gone,才能生效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值