BaseAdapter和毕加索问题

我在使用Picasso从服务器加载ListView中的图像时遇到问题。

我有一个BaseAdapter用于填充我的ListView。 在这个ListView中,有些项目有图像,有些没有。

在这个方法中:

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

我做:

  ... //context = Activity context; //context1 = Context context1; context1 = context.getApplicationContext(); if (!photo[position].equals("")) { String stringurl = "http://www.blablabla.it/img/"+photo[position]+".jpg"; Picasso.with(context1) .load(stringurl) .placeholder(R.drawable.white) .into(holder.imageD); } else { holder.imageD.setImageBitmap(null); } 

这段代码工作,但我经常看到图像与其所属的位置不同!

你可以想象这对用户来说非常烦人..谢谢大家

你曾遇到过这个问题,因为ListView回收物品视图+ Picasso调用是异步的……它怎么会出现?

  1. 开始加载毕加索
  2. 视图被重用(convertView!= null)
  3. 你正在设置holder.imageD.setImageBitmap(null);
  4. 从第1点开始异步完成

这就是为什么你有错误的图像加载…

为避免此类行为,您需要通知Picasso加载程序取消先前的请求。 因此,只需将图像位图设置为null,您必须通过Picasso库设置它(在其他参数中使用):

Picasso.with(context1).load(null).placeholder(R.drawable.white).into(holder.imageD);

编辑:关注@Budius评论:更好的解决方案将取消并设置为:

 { Picasso.with(context1).cancelRequest(holder.imageD); //holder.imageD.setImageBitmap(null); //or holder.imageD.setImageResource(R.drawable.white); //depends on your needs } 

这应该是更有效的方式,因为它应该在每个getView调用上创建更少的内部对象。