參考:工作原理:
1.listview針對list中每個item,要求adapter給其乙個檢視(getview)
2.乙個新的檢視被返回並顯示
如果我們有上億個item要顯示怎麼辦?為每個專案建立乙個新檢視?no!這不可能~~~android實際上提供了快取檢視
android中有個叫做recycler(
反覆迴圈器
)的構件,下圖是它的工作原理:
2.listview先請求乙個type1檢視(getview),然後請求其他可見的專案。convertview在getview中是null的。
3.當item1滾出螢幕,並且乙個新的專案從螢幕底部滑上來時,listview再請求乙個type1檢視。
convertview此時不是空值了,它的值是item1.你只需要設定新的資料返回convertview,
不必重新建立乙個檢視。這樣直接使用convertview從而減少了不必要的
view的建立。
!更快的方式是定義乙個viewholder,將convertview的tag設定為viewholder,當convertview不為空時
重新使用viewholder。
viewholder只是將需要快取的子view封裝好,convertview的settag方法才是將這些快取起來供下次呼叫。
當你的listview裡布局多樣化的時候 viewholder的作用就有比較明顯的體現了。
當然了,單一模式的布局一樣有效能優化的作用只是不直觀。
假如你2種模式的布局當發生**的時候,你會用settag分別記錄是哪兩種,
這兩種模式會被封裝到viewholder中進行儲存方便你下次使用。
vh就是個靜態類,與快取無關的。
public class multipleitemslist extends listactivity
setlistadapter(madapter);
}private class mycustomadapter extends baseadapter
public void additem(final string item)
@override
public int getcount()
@override
public string getitem(int position)
@override
public long getitemid(int position)
@override
public view getview(int position, >view convertview, viewgroup parent) else
holder.textview.settext(mdata.get(position));
return convertview;}}
public static class viewholder
}
參考資料:
ListView巢狀ListView優化
在做業務時候,乙個listview顯示多種資料型別,我們想到的方法是listview在巢狀乙個listview,對於子listview 佔父listview的一行,就解決了問題,但是這樣的邏輯是不是有點奇怪呢?第一,父listview的長度size需要加1,因為增加了一行放子listview pub...
python 效能優化(2)
第二部分 有益的提醒,靜態編譯的 仍然重要.僅例舉幾例,chrome,firefox,mysql,ms office 和 photoshop都是高度優化的軟體,我們每天都在使用.python作為解析語言,很明顯不適合.不能單靠python來滿足那些效能是首要指示的領域.這就是為什麼python支援讓...
hibernate 效能優化2
初用hibernate的人也許都遇到過效能問題,實現同一功能,用hibernate與用jdbc效能相差十幾倍很正常,如果不及早調整,很可能影響整個專案的進度。大體上,對於hibernate效能調優的主要考慮點如下 資料庫設計調整 hql優化 api的正確使用 如根據不同的業務型別選用不同的集合及查詢...