之前項目沒有這需求,也就沒有瞭解過這個東西,認爲只要在getView時候加載不同的layout就可以了(事實證明不用視圖緩存的話這種方法確實可行,加上視圖緩存就沒任何效果了)
必須重寫2個方法來實現
getItemViewType //獲取當前item的type
getViewTypeCount//獲取當前Listview中有多少個不同的item
以上兩個缺一不可
ps:我犯了一個錯誤 就是將type 設置爲1和2,結果報錯數組下標越界,然後看其源碼相關實現
ListView中mRecycler是Abslistview 內部類RecycleBin ,用來存放item
其setViewTypeCount方法如下:
public void setViewTypeCount(int viewTypeCount) { if (viewTypeCount < 1) { throw new IllegalArgumentException("Can't have a viewTypeCount < 1");//判斷item,BaseAdapter中默認爲1 } //noinspection unchecked ArrayList<View>[] scrapViews = new ArrayList[viewTypeCount];//以數組的方式來存放不同的item,讀取時也就出現額下標越界的情況 for (int i = 0; i < viewTypeCount; i++) { scrapViews[i] = new ArrayList<View>(); } mViewTypeCount = viewTypeCount; mCurrentScrap = scrapViews[0]; mScrapViews = scrapViews; }
以下是一些深入研究listview的內容