項(xiàng)目中用到1個(gè)內(nèi)部復(fù)雜布局的listview,每一個(gè)item中都有動(dòng)態(tài)的子item,相當(dāng)于listview的item中還有l(wèi)istview的樣式。剛開始做的思路是,用1個(gè)listview,然后item中加個(gè)LinearLayout,然后代碼動(dòng)態(tài)的生成子item view 添加在其中,希望這樣的表述大家能明白,依照這樣的思路做好以后發(fā)現(xiàn)快速滑動(dòng)的時(shí)候,1卡1頓,實(shí)在不能直視,在配置低點(diǎn)的機(jī)器上更是不能看。
但是由于趕進(jìn)度1直沒有優(yōu)化,現(xiàn)在回頭看下,雖然已用了viewHolder但是listview緩沖的機(jī)制完全沒有發(fā)揮作用,由于每一個(gè)item show的時(shí)候都需要removeAll 子item,然后再添加1遍,繪制的時(shí)間太長(zhǎng),造成了卡頓。
怎樣解決這個(gè)問題尼?
剛好google在support v7推出了recyclerView,有著更好的緩存優(yōu)化機(jī)制,我如獲救星,趕快將listview換成了recyclerView,但是效果不盡人意,沒有我想象中的效力提升,仔細(xì)想了想,recycleView只是針對(duì)listView的多type情況做了優(yōu)化,而實(shí)際需求中還是在item中動(dòng)態(tài)的生成item,沒有用到recyclerView的優(yōu)勢(shì)。
那末自然下面想到的就是干掉動(dòng)態(tài)生成的Item部份,把數(shù)據(jù)拆分成1個(gè)1個(gè)的listview item。但是又擔(dān)心這樣的工作量會(huì)不會(huì)很大,實(shí)際抽象進(jìn)程中發(fā)現(xiàn)很容易,就把原來(lái)1個(gè)model數(shù)據(jù)拆分成了7個(gè)不同類型的model,getView的時(shí)候先通過postion 獲得當(dāng)前model的type,然后返回不同的View item,很簡(jiǎn)單的就把原來(lái)只有1種item的listview拆分成了1個(gè)有7種類型Item的listView。跑起來(lái)以后,速度嘩嘩的,感覺就更1個(gè)item的1樣。
listView支持多種類型的Item時(shí)候還有個(gè)坑:繼承BaseAdapter的時(shí)候必須復(fù)寫下面兩個(gè)方法
The RecyclerView
widget
is a more advanced and flexible version of ListView
.
This widget is a container for displaying large data sets that can be scrolled very efficiently by maintaining a limited number of views. Use the RecyclerView
widget
when you have data collections whose elements change at runtime based on user action or network events.
希望能幫助到有類似需求的同學(xué):
ListView中有復(fù)雜布局,特別是有動(dòng)態(tài)生成的布局的子布局的,可以斟酌1下將原來(lái)的Item拆分成不同的類型,然后使用recyclerView。