これは意図された動作です。API 17 のガイダンスについては、こちらの Android ソース コードを参照してください。関連する部分は次のとおりです。
リストの上部に表示される固定ビューを追加します。addHeaderView が複数回呼び出された場合、ビューは追加された順序で表示されます。この呼び出しを使用して追加されたビューは、必要に応じてフォーカスを取得できます。注: setAdapter を呼び出す前にこれを呼び出します。これは、ListView が提供されたカーソルを、ヘッダー ビューとフッター ビューも考慮したカーソルでラップできるようにするためです。
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."); // Edit: SK9 wrapped this.
}
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();
}
}
ヘッダーを再度追加しようとすると、アダプターは null ではなく、例外が発生します。問題を解決するには、次の行に沿って何かを行うとうまくいきます。
setListAdapter(null);
getListView().addHeaderView(mHeader);
setListAdapter(new MyAdapter(getActivity(), items));
これを回避策として分類することさえしません。同じ問題が発生しましたが、これでうまくいきました。
どうやらフッターの扱いは大きく異なります。こちらを参照してください。
public void addFooterView(View v, Object data, boolean isSelectable) {
// NOTE: do not enforce the adapter being null here, since unlike in
// addHeaderView, it was never enforced here, and so existing apps are
// relying on being able to add a footer and then calling setAdapter to
// force creation of the HeaderViewListAdapter wrapper
FixedViewInfo info = new FixedViewInfo();
info.view = v;
info.data = data;
info.isSelectable = isSelectable;
mFooterViewInfos.add(info);
// in the case of re-adding a footer view, or adding one later on,
// we need to notify the observer
if (mAdapter != null && mDataSetObserver != null) {
mDataSetObserver.onChanged();
}
}