【问题标题】:First Adapter image is incorrect第一个适配器图像不正确
【发布时间】:2011-10-01 01:30:50
【问题描述】:

由于某种原因,我的第一张图片正确显示,然后被另一个用户的图片覆盖。任何想法:

public View getView(int position, View convertView, ViewGroup parent) { 
        View vi=convertView; 
        ViewHolder holder;
        if( convertView == null ){
                vi = inflater.inflate(R.layout.feed_item, null);
                holder=new ViewHolder();
                holder.userImage = (ImageView) vi.findViewById(R.id.feed_userimage);
                vi.setTag(holder);
        } else {
                holder=(ViewHolder)vi.getTag();
        }
        if(user.has("image") && 
          user.getString("image") != null && 
          !user.getString("image").equals("null")) {
                holder.userImage.setTag(user.getString("image"));
                imageLoader.DisplayImage(user.getString("image"), act, holder.userImage,USER_IMAGE_SIZE);
        } else {
                holder.userImage.setImageDrawable(null);
        }

【问题讨论】:

  • 为什么要自定义 getView()?
  • 至少向我们展示整个 getView 代码!我会给出第一个答案,但请告诉我整个代码
  • 我们可以看看DisplayImage方法。
  • 这里没有看到任何依赖位置的代码,并不是说可能有问题,只是指出来。每个列表项的相同用户图像?那是你真正想要的吗?
  • 在这种情况下用户是什么,如果它的集合也发布了该代码,那么您在哪里迭代

标签: android


【解决方案1】:

试试这个修复

if(user.has("image") && 
    user.getString("image") != null && 
    !user.getString("image").equals("null")) {
  holder.userImage.setTag(user.getString("image"));
  imageLoader.DisplayImage(user.getString("image"), act, holder.userImage,USER_IMAGE_SIZE);
} else {
   holder.userImage.setTag(null);//add this line
   holder.userImage.setImageDrawable(null);
}

【讨论】:

  • 抱歉,正确的图像仍然显示一秒钟,然后随着列表的其余部分加载,它被另一个用户的图像替换。
  • 当您使用我的示例应用程序时,它的工作方式是否相同?如果不是,您能确定您的代码和我的示例之间的区别吗?
  • 我的意思是,当您从这里github.com/thest1/LazyList 使用我的示例应用程序时,它的工作原理是否相同?
  • 你能给我一个有这个问题的示例项目吗?我需要一种重现问题的方法来调试它。
  • 我已经从 github 安装了最新的惰性列表,我喜欢新的内存管理....干得好!它可能也解决了这个问题。陪审团仍未出局,但情况看起来不错!
【解决方案2】:

发生这种情况是因为您使用的是convertView。传递给 getView 方法的 convertView 本质上是您在之前的 getView 调用中创建(通过膨胀)的视图对象(不再需要它,因为它不再可见,由于滚动)。

您假设每次调用getView 时都会创建一个新视图,而您实际上是在使用以前创建的视图。 convertView 作为优化传递,因此当只有少数可见时不必创建太多视图。 所以setTag 调用实际上覆盖了之前创建的视图的tag

您应该重新考虑在不使用tags 的情况下重写您的代码。或者,您可以随时为视图膨胀,而不是仅在 convertView 不是 null 时膨胀。但我不推荐这种方法,因为列表很长,这意味着内存中有太多不必要的视图。

【讨论】:

  • 您给出的原因是正确的,罪魁祸首是Android缓存视图以及更频繁地调用getview(0)的事实。但修复仍然不明显。还在找。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2016-01-22
  • 2019-12-31
相关资源
最近更新 更多