欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android Listview 滑動過程中提示圖片重復(fù)錯亂的原因及解決方法

 更新時間:2016年08月23日 11:27:35   作者:探索者丶  
android中l(wèi)istview是比較常見的組件,通過本文主要給大家分析Android中Listview滾動過程造成的圖片顯示重復(fù)、錯亂、閃爍的原因及解決方法,順便跟進Listview的緩存機制,感興趣的朋友一起看下吧

主要分析Android中Listview滾動過程造成的圖片顯示重復(fù)、錯亂、閃爍的原因及解決方法,順便跟進Listview的緩存機制。

1、原因分析

Listview item 緩存機制:為了使得性能更優(yōu),Listview會緩存行item(某行對應(yīng)的view)。listview通過adapter的getview函數(shù)獲得每行的item?;瑒舆^程中,

a、如果某行item已經(jīng)劃出屏幕,若該item不在緩存內(nèi),則put進緩存,否則更新緩存;

b、獲取滑入屏幕的行item之前會先判斷緩存中是否有可用的item,如果有,作為convertview參數(shù)傳遞給adapter的getview。

這樣的話如下的getview寫法就可以充分利用緩存大大提升listview的性能。即便上萬個行item,最多inflate的次數(shù)為n,n為一屏最多顯示listview行item的個數(shù)。

@Override
public View getView(int position,View convertView,ViewGroup parent){
ViewHolder holder;
if(convertView == null){
convertView = inflater.inflate(R.layout.list_item,null);
holder = new ViewHolder();
....convertView.setTag(holder);
}else{
holder = (ViewHolder)convertView.getTag();
}
}

這樣提升了性能,但同時造成了一些問題。

a、行item圖片顯示重復(fù)

這個顯示重復(fù)是指當(dāng)前行item顯示了之前某行item的圖片

比如listview滑動到第二行會異步加載某個圖片,但是加載很慢,加載過程中l(wèi)istview已經(jīng)加載到15行,且滑動過程中該圖片加載結(jié)束,第二行 已經(jīng)不再屏幕內(nèi),根據(jù)上面介紹的緩存原理,第二行的view可能被第14行服用,這樣我們看到的就是14行顯示了本該屬于第二行的圖片,造成重復(fù)。

b、行item圖片顯示錯亂

這個顯示錯亂是指某行item顯示了不屬于該行item的圖片。

比如listview滑動到第二行會異步加載某個圖片,但是加載很慢,加載過程中l(wèi)istview已經(jīng)滑動到14行,第二行已經(jīng)不再屏幕內(nèi),根據(jù)上面介紹 的緩存原理,第二行的view可能被第14行的復(fù)用,第十四行顯示了第二行的view這時之前的圖片加載結(jié)束,就會顯示在第14行,造成混亂。

c、行item圖品顯示閃爍

上面b情況,14行圖片又很快加載結(jié)束,所以我們看到第14行先顯示了第二行的圖片,馬上又顯示了自己的圖片進行覆蓋造成的閃爍錯亂。

2、解決方法

通過上面的分析我們知道了出現(xiàn)錯亂的原因是異步加載及對象被復(fù)用造成的,如果每次getview能給對象一個標(biāo)識,在異步加載完成時比較標(biāo)識與當(dāng)前的item的標(biāo)識是否是一致的,一致的則顯示,否則不做處理即可。

代碼中加上

@Override
public View getView(int position,View convertView,ViewGroup parent){
ViewHolder holder;
if(convertView == null){
convertView = inflater.inflate(R.layout.list_item,null);
holder = new ViewHolder();
....convertView.setTag(holder);
}else{
holder = (ViewHolder)convertView.getTag();
}
。。。。。
imageview.setTag(imageurl);
if(!cache.icon_catch.get(imageurl,imageview){
imageview.setimageDrawable(null);
}
}

其中setTag表示設(shè)置標(biāo)識,方便下面進行標(biāo)志比對

if ( ! Cache . ICON_CACHE . get ( imageUrl , imageView ) )

Cache.ICON_CACHE為ImageCache的實例,表示如果不在緩存內(nèi)則設(shè)置drawable為null(當(dāng)然你可以可以設(shè)置為你自己的默認資源),防止顯示了之前某個行item的圖片,解決了a. 行item圖片顯示重復(fù)問題。

在ImageCache的OnImageCallbackListener的onImageLoaded函數(shù)中添加

Java

public void onImageLoaded ( String imageUrl , Drawable imageDrawable , View view , booleanisInCache ) {
// can be another view child, like textView and so on
if ( view != null && imageDrawable != null ) {
ImageView imageView = ( ImageView ) view ;
// add tag judge, avoid listView cache and so on
String imageUrlTag = ( String ) imageView . getTag ( ) ;
if ( ObjectUtils . isEquals ( imageUrlTag , imageUrl ) ) {
imageView . setImageDrawable ( imageDrawable ) ;
}
}
} ;

在上面用String imageUrlTag = (String)imageView.getTag();取得之前設(shè)置的tag,然后和當(dāng)前的url進行比較,如果相等則顯示,解決了b. 行item圖片顯示錯亂,c. 行item圖片顯示錯亂的兩個問題。其中ObjectUtils可見ObjectUtils@Github .

其他異步加載過程解決原理類似。

以上所述是小編給大家介紹的Android Listview 滑動過程中提示圖片重復(fù)錯亂的原因及解決方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

最新評論