Android解決添加FootView或HeadView不顯示的兼容性問題


測試反饋在OPPO手機下,listview的footview不顯示,自己研究一下headview也同樣不顯示,后來研究了一下解決了這個問題

解決方法如下:

ListView listView = findViewById(listviewId);
BaseAdapter adapter = new MyBaseAdapter(Context, Arraylist);
View headView = (View) LayoutInflater.from(this).inflate(R.layout.headview, null);
View footView = (View) LayoutInflater.from(this).inflate(R.layout.footview, null);
listView.addHeadView(headView);
listView.addFootView(footView);
listView.setAdapter(adapter);// 將設置適配器的操作延后
adapter.notifyDataSetChanged();

深度解析:

源代碼解析:

ListView.setAdapter(adapter)部分源碼:

   if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) {// 如果headView的集合,或者footView的集合不為空,就進行Adapter轉換
            mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);
       } else {
            mAdapter = adapter;// 沒有執行添加頭部和尾部的操作
      }

ListView.addFootView()部分源碼:

  ...
        // Wrap the adapter if it wasn't already wrapped.
        if (mAdapter != null) {// 執行過了setAdapter(adapter)
            if (!(mAdapter instanceof HeaderViewListAdapter)) {// 如果Adapter沒進行過轉換,就轉換
                mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, mAdapter);
            }
            ...
        }

由以上源碼可以看出,無論是先添加FootView還是先setAdapter,mAdapter都會被轉換成HeaderViewListAdapter,其中HeaderViewListAdapter和BaseAdapter一樣,都是ListAdapter的實現類,是對BaseAdapter的二次封裝。

所以很大可能在OPPO的framework源碼中,程序小哥在碼ListView.addFootView(footview)方法時感覺某行代碼沒用給注釋了:

  ...
        // Wrap the adapter if it wasn't already wrapped.
        if (mAdapter != null) {// 執行過了setAdapter(adapter)
            if (!(mAdapter instanceof HeaderViewListAdapter)) {// 如果Adapter沒進行過轉換,就轉換
                // mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, mAdapter);// 這行代碼被人無意中注釋或刪除了
            }
            ...
        }

好了繼續碼代碼!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM