測試反饋在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);// 這行代碼被人無意中注釋或刪除了 } ... }
好了繼續碼代碼!
