毕加索重复图像

时间:2017-04-05 20:40:44

标签: android picasso

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

让我们说屏幕显示四个项目,所有项目都包含图片网址。第五项,就在屏幕上可以看到的内容下面没有图像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 个答案:

答案 0 :(得分:1)

那是因为你看到了回收的视图。 ListView不会删除第4个项目,滚动时将会返回给您。并且因为当第4个项目从屏幕滚动时,您没有注意删除图像,所以此图像仍然存在。

您需要做的是参考this answer。只要您的ImageView行被滚动离开屏幕即可重置ListView的来源(即"已回收")。 onDetachedFromWindow()是适当的回调。