ListView的addHeaderView和setAdapter的調用順序,setadapter

來源:互聯網
上載者:User

ListView的addHeaderView和setAdapter的調用順序,setadapter

ListView想要添加headerview的話,就要通過addHeaderView這個方法,然後想要為ListView設定資料的話,就要調用setAdapter方法了。但是,在調用addHeaderView和setAdapter的順序上,有時會爆出java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called.的異常。這是因為我們在addHeaderView之前調用了setAdapter。所以,在這裡,建議setAdapter需要在addHeaderView和addfooterView之後調用。這樣就安全了。下面,我們來看看源碼吧。看看究竟是什麼原因造成的。

Android-18(4.3)的addHeaderView源碼:

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);         // Wrap the adapter if it wasn't already wrapped.        if (mAdapter != null) {            if (!(mAdapter instanceof HeaderViewListAdapter)) {                mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, mAdapter);            }             // 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();            }        }}

Android-17(4.2)的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();        }}
在上面,我們可以對比出代碼中的處理的不同。在17版本中,只要adapter不為空白的話,那就直接會拋出異常,而這個異常恰好就是我們文章開頭說到的異常。在18版本中,如果adapter不為空白的話,則會建立一個adapter,這個adapter會包含了headerview和footerview以及我們傳進來的原來的adapter。這是在18版本以後做的一個處理。雖然有了處理,但是建議大家還是按照上面說的調用順序來使用addHeaderView,addFooterView和setAdapter吧。


listView 還沒有setAdapter時,headerView沒顯示?

adapter本來就是用來綁定資料的,你都還沒有setadapter,你加一個headerView有什麼意義呢?(這個理由我不是百分百的確定是否正確) 只是 我之前自己在做一個關於addheaderview的需求的時候遇到過類似的問題: 我要根據業務來 顯示或者移除headerview,如果 你已經setadapter了,那麼你是無法再去添加headview的 它會報錯:告訴你 在setadapter之後,你才添加headview。所以 反推之 我覺得 你沒有設定adatper 它是不會顯示任何效果的
 
安卓開發 listview 增加了addHeaderView,view裡面有個按鈕,不可以點擊

1422658635 看你加到多少分了
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.