BaseAdapter和毕加索问题

时间:2015-02-02 10:30:24

标签: java android listview baseadapter picasso

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

我有一个用于填充ListView的BaseAdapter。在这个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);
 }

此代码有效,但我经常看到图片所在的位置与其所属的位置不同!

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

1 个答案:

答案 0 :(得分:2)

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

  1. 开始加载Picasso
  2. 重复使用视图(convertView!= null)
  3. 您正在设置holder.imageD.setImageBitmap(null);
  4. 从第1点开始异步
  5. 这就是你加载错误图像的原因......

    要避免此类行为,您需要通知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调用上创建更少的内部对象。