2017-04-05 164 views
1

所以,我在Listview中使用毕加索。以下是我的适配器的相关部分。每个项目都有一个图像和一个标题。我尝试下载该项目的图像,如果该项目的URL是空字符串,我使用本地图像作为占位符。一切工作正常,除了有一个图像刚刚离开屏幕。毕加索重复图像

假设屏幕显示了四个项目,全部都包含图片网址。第五项,就在屏幕上可以看到没有图像的网址,因此应该显示默认的占位符图像。问题是,当我向下滚动时,第五张图像显示第四项的图像。如果我滚动屏幕上的第五个项目并返回,它将恢复为占位符。我在列表中的其他任何地方似乎都没有这个问题。

我在做什么错?

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     final ViewHolder holder; 
     if (v == null) { 
      LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
        Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.staff_directory_list_item, null); 
      holder = new ViewHolder(); 
      holder.name = (TextView) v.findViewById(R.id.StaffDirectoryName); 
      holder.image = (ImageView) v.findViewById(R.id.StaffDirectoryImage); 
     } else { 
      holder = (ViewHolder) v.getTag(); 
     } 
      holder.title.setText(mStaffMembers.get(position).getTitle()); 
      String imageUrl = mStaffMembers.get(position).getImage(); 

      try { 
       Picasso.with(context).cancelRequest(holder.image); 
       Picasso.with(context).load(imageUrl) 
           .placeholder(R.drawable.image_placeholder) 
           .error(R.drawable.image_placeholder) 
           .centerCrop() 
           .fit() 
           .tag(context) 
           .into(holder.image); 
       } catch (IllegalArgumentException e) { 
        e.printStackTrace(); 
        Picasso.with(context).cancelRequest(holder.image); 
        Picasso.with(context) 
           .load(R.drawable.image_placeholder) 
           .into(holder.image); 
       } 
      } 
     return v; 
    } 

回答

1

这是因为您正在看到回收视图。第4项不会被ListView删除,并且随着您的滚动将被带回给您。而且,因为当第4个项目从屏幕上滚动出来时,您没有注意删除图像,所以此图像仍然存在。你需要做的是参考this answer。只要您的ListView的行正在滚动屏幕(即“回收”),请重置ImageView的来源。 onDetachedFromWindow()是适当的回调。