所以,我在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;
}
答案 0 :(得分:1)
那是因为你看到了回收的视图。 ListView
不会删除第4个项目,滚动时将会返回给您。并且因为当第4个项目从屏幕滚动时,您没有注意删除图像,所以此图像仍然存在。
您需要做的是参考this answer。只要您的ImageView
行被滚动离开屏幕即可重置ListView
的来源(即"已回收")。 onDetachedFromWindow()
是适当的回调。