Cannot add header view to list -- setAdapter has already been called.

是什麼?

這裏寫圖片描述

直接翻譯“無法在列表中添加 header view – setAdapter 已經被調用”,再換句話“不能在調用 setAdapter 之後,向 ListView 添加header view“。

這個問題是我在我調試下拉刷新ListView時遇到的(《 自定義控件:含下拉刷新和上拉加載的 ListView》),也算是漲了點姿勢。

爲什麼?

這裏寫圖片描述

點開 api17 的 ListView.addHeaderView(),發現有這麼個 if 邏輯。註釋中提示

Call this before calling setAdapter. 
This is so ListView can wrap the supplied cursor with one that will also account for header and footer views.

可見:setAdapter 會對 addHeaderView 造成影響。

再來看 api19

這裏寫圖片描述

已經不再有拋異常的邏輯了,註釋中提示:

When first introduced, this method could only be called before setting the adapter with 
Starting with {@link android.os.Build.VERSION_CODES#KITKAT} this method may be  called at any time

從 KITKAT(android 4.4, api19) 開始,可以在任何地方調用方法了。

怎麼做?

總結:雖然在 api19 之後,不再受這個限制,但是爲了兼容低版本,還是建議在 setAdapter 之前調用 addHeaderView。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章