Android列表视图在快速滚动时随机加载图像

时间:2014-09-10 21:45:09

标签: android listview android-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;
}

当我快速滚动列表视图时,图像视图中的图像会发生变化,它们会被置于错误的位置。一种解决方案是删除

if(convertview==null)

但这一次,listview不能顺利滚动。任何人都可以帮我解决这个问题吗?

由于

1 个答案:

答案 0 :(得分:5)

当您使用convertviews时,这意味着listview将尝试回收视图。在您的情况下,这意味着相同的视图将在listview中的不同位置使用,并且您实际上尝试将不同的图像加载到相同的imageview中。为了防止这种情况,请尝试使用Picasso或Volley,他们将此视图重新用于整理出来。

如果您想手动执行此操作,则必须观看视图何时离开屏幕并取消图像拉取请求,以使该图像视图可用于处理该位置的正确图像。

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