android ListView出现Caused by: java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called.

在android4.2及以前 必须先设置 

addHeaderView和addFooterView

  然后设置 

setAdapter

 

在4.3以上 就没问题:

源码 4.2

 public void More ...addHeaderView(View v) {
         addHeaderView(v, null, true);
 }
会先判断adapter是否为空
    public void More ...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();
         }
     }

  在4.2以上

    public void addHeaderView(View v, Object data, boolean isSelectable) {
        final FixedViewInfo info = new FixedViewInfo();
        info.view = v;
        info.data = data;
        info.isSelectable = isSelectable;
        mHeaderViewInfos.add(info);
        mAreAllItemsSelectable &= isSelectable;

        // Wrap the adapter if it wasn't already wrapped.
        if (mAdapter != null) {
            if (!(mAdapter instanceof HeaderViewListAdapter)) {
                wrapHeaderListAdapterInternal();
            }

            // In the case of re-adding a header view, or adding one later on,
            // we need to notify the observer.
            if (mDataSetObserver != null) {
                mDataSetObserver.onChanged();
            }
        }
    }

  已经处理了

所以 为了兼容低版本:

先添加headr和footer然后再去设置adapter.

posted @ 2017-07-20 11:13  丫丫25001  阅读(274)  评论(0编辑  收藏  举报