Java BaseAdapter与毕加索问题

Java BaseAdapter与毕加索问题,java,android,listview,baseadapter,picasso,Java,Android,Listview,Baseadapter,Picasso,我在使用毕加索从服务器加载ListView中的图像时遇到问题 我有一个BaseAdapter,用于填充我的ListView。在此ListView中,有些项目有图像,有些项目没有 在这种方法中: public View getView(final int position, View convertView, ViewGroup parent) { 我有: 这段代码可以工作,但我经常看到图像位于与其所属位置不同的位置 可以想象,这对用户来说是非常烦人的。。谢谢大家您遇到了这个问题,因为ListV

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

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

在这种方法中:

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

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


可以想象,这对用户来说是非常烦人的。。谢谢大家

您遇到了这个问题,因为ListView回收项目视图+毕加索调用是异步的。。。它是如何出现的

  • 您可以开始加载毕加索
  • 视图被重用(convertView!=null)
  • 您正在设置
    holder.imageD.setImageBitmap(null)
  • 从第1点开始异步。芬兰
  • 这就是为什么你加载了错误的图像

    为了避免这种行为,您需要通知毕加索加载器取消之前的请求。 因此,只需将图像位图设置为null,您必须通过毕加索库(在else Station使用中)进行设置:

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

    您还应该在else Station中使用毕加索调用。。。然后应该取消对holder.imageD的任何加载请求…@Selvin,所以我应该写:holder.imageD.setImageBitmap(null);如果(…){Picasso…}?你能给我举个例子吗?
    else{Picasso.with(context1).load(null).placeholder(R.drawable.white).into(holder.imageD);}
    @Selvin write:else{holder.imageD.setImageBitmap(null);}不是一回事吗?不!你读过我的评论了吗?我认为最好是手动设置图像上的空值,然后通知毕加索取消请求
    Picasso.with(c).cancelRequest(holder.imageD);holder.imageD.setImageBitmap(空)你的方式似乎在无缘无故地创建一个新请求。@Budius。。。你说的“新请求”是什么意思?(来自piccasso库的请求对象或某个网络请求?)事实上,它几乎与“into”中的代码相同:
    if(!data.hasImage()){picasso.cancelRequest(target);target.onPrepareLoad(setPlaceholder?getPlaceholderDrawable():null);return;}
    如果uri为null,则hasImage返回false。。。因此,将不会使用网络操作(如果事实如此,将是syncrounus调用)。。。此外,在我的版本中,将使用占位符,而不是库中的null bitmapI表示
    新请求创建者
    对象。从源代码行#293
    if(path==null){returnnewrequestcreator(this,null,0)
    私有void cancelExistingRequest(对象目标)
    code-on-line#569只是取消了现有的一个。我知道它们很小,但想象一下,滚动数千个项目的列表以及GC必须运行以删除所有这些小对象。关于占位符:它也可以调用ImageView上的
    setImageResource(R…)
    (来源:)好的…我已经在答案中添加了您的评论…仍然不知道占位符是否以某种方式被缓存…android framework是否正在缓存
    setImageResource
    …如果答案是肯定和否定,那么第一个版本可能会更有效:)
    {
      Picasso.with(context1).cancelRequest(holder.imageD);
      //holder.imageD.setImageBitmap(null); //or
      holder.imageD.setImageResource(R.drawable.white); //depends on your needs
    }