2014-09-10 46 views
1

我已經看到了這類似的問題,但我是不同一點點:Android的ListView控件加載圖片時隨機滾動快

我有一個ListView和每行有加載來自URL的圖片的ImageView的。這裏是我的適配器:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    ViewHolder holder=null; 

    if(convertView==null){ 
     LayoutInflater inflater = (LayoutInflater) this.getContext() 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.bestof_list_row, parent, false); 

     holder = new ViewHolder(); 

     holder.textviewRowNumber = (TextView) convertView.findViewById(R.id.textview_row_number); 
     holder.imageviewUserPic = (RemoteImageView) convertView.findViewById(R.id.imageview_user_profile_pic); 
     holder.textviewUsername = (TextView) convertView.findViewById(R.id.textview_username); 
     holder.textviewSubtextBold = (TextView) convertView.findViewById(R.id.textview_subtext_bold); 
     holder.textviewSubtextNotBold = (TextView) convertView.findViewById(R.id.textview_subtext_not_bold); 
    }else{   
     holder = (ViewHolder) convertView.getTag();   
    }  

    BestOfSubTabListItem item = getItem(position); 

    holder.textviewRowNumber.setText(String.valueOf(position+1));  
    holder.imageviewUserPic.setRemoteURI(item.getUserAvatarURL()); 
    holder.imageviewUserPic.loadImage();   
    holder.textviewUsername.setText(item.getUsername());  

    if(feedType == SocialFeedType.hero2){ 
     holder.textviewSubtextBold.setVisibility(View.GONE); 
     holder.textviewSubtextNotBold.setVisibility(View.GONE); 
    }else{ 
     holder.textviewSubtextBold.setVisibility(View.VISIBLE); 
     holder.textviewSubtextNotBold.setVisibility(View.VISIBLE);   
     holder.textviewSubtextBold.setText(item.getSubtextBold());   
     holder.textviewSubtextNotBold.setText(item.getSubTextNotBold()); 
    } 

    convertView.setTag(holder); 
    return convertView; 
} 

static class ViewHolder{   
    public TextView textviewRowNumber; 
    public RemoteImageView imageviewUserPic; 
    public TextView textviewUsername; 
    public TextView textviewSubtextBold; 
    public TextView textviewSubtextNotBold; 
} 

當我滾動列表視圖快,imageviews變化的圖像,它們被放在錯誤的位置。一個解決方案是刪除

if(convertview==null) 

但這次,listview不滾動順利。任何人都可以幫我解決這個問題嗎?

感謝

+0

你可以發佈你的loadImage()方法嗎? – 2014-09-10 22:53:51

+0

@JaySoyer這是一個很長的方法,我相信它沒有什麼不對,因爲如果我不關心性能問題並刪除if(convertview == null)行,它將加載正確的圖像,但滾動變得不順暢 – yrazlik 2014-09-10 22:56:03

+0

正確。那麼我會更概念地寫出我的答案。 – 2014-09-10 23:06:30

回答

5

當你使用convertviews,這意味着列表視圖將嘗試回收的意見。在你的情況下,這意味着相同的視圖將被用在不同的位置在列表視圖中,你實際上試圖加載不同的圖像到相同的圖像視圖。爲了防止這種情況,請嘗試使用畢加索或者排球,他們有這種觀點重新使用的東西整理出來。

如果您想手動執行此操作,您必須觀看視圖什麼時候離開屏幕並取消圖像拖動請求,以使該圖像視圖可用於處理該位置的正確圖像。

http://square.github.io/picasso/

+0

感謝您的回答,我想手動完成,所以我怎麼看我的視圖何時離開屏幕? – yrazlik 2014-09-10 22:15:32

+0

下面是Google解決這個問題的例子。 https://github.com/mcxiaoke/android-volley/blob/master/src/com/android/volley/toolbox/NetworkImageView.java 在第202行,他們正在觀看視圖何時從窗口分離,取消待處理的請求(如果有的話) – 2014-09-10 22:25:50

+0

謝謝,我會看看它 – yrazlik 2014-09-10 22:27:22