大概如下圖所示的一種需求:整體是一個(gè)列表,列表最末尾有一項(xiàng)和其他item略有區(qū)別的item。

剛開(kāi)始時(shí),由于左側(cè)都是按照?qǐng)D片來(lái)加載,并沒(méi)有出現(xiàn)任何問(wèn)題。使用Fresco庫(kù)加載,也不會(huì)出現(xiàn)列表滑動(dòng)時(shí),圖片錯(cuò)亂的問(wèn)題。
然而后續(xù)迭代時(shí),需要將圖片的背景和icon分離,方便產(chǎn)品配置顏色或者支持主題等。
因此這個(gè)ImageView就分為兩部分處理,icon部分繼續(xù)交給Fresco加載,背景部分則需要自己處理。這里是根據(jù)圖片的url來(lái)判斷,如果符合要求,則手動(dòng)構(gòu)造一個(gè)drawable并setBackground()到相關(guān)的view當(dāng)中去。
然而由于listview中,itemview的視圖實(shí)際上是會(huì)被復(fù)用的,因此當(dāng)對(duì)其中某些view設(shè)置了background后,滑動(dòng)幾次,這個(gè)view將可能被復(fù)用到各個(gè)itemview上,特別的,對(duì)于尾部的item,非常容易獲取到頭部item的緩存視圖。即便所有icon都能正常加載,但是item的背景依然會(huì)出現(xiàn)復(fù)用的情況。
知道問(wèn)題根源,解決其他就很簡(jiǎn)單,在adapter的getView方法中,判斷當(dāng)前viewHolder的類型,如果是末尾這種特殊的情況,手動(dòng)清理view的background即可。
PS:Android view.setBackgroundDrawable()方法已經(jīng)被設(shè)為廢棄,而view.setBackGround()方法最小支持sdk 16,項(xiàng)目最低支持sdk 15也是蛋疼。。。