繁体   English   中英

BaseAdapter 和 Picasso 问题

[英]BaseAdapter and Picasso issue

我在使用 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);
 }

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

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

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

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

这就是为什么你加载了错误的图像......

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

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 调用时创建更少的内部对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM