【问题标题】:ImageView overlap when adding more items in existing ListVIew在现有 ListVIew 中添加更多项目时 ImageView 重叠
【发布时间】:2012-08-13 05:16:36
【问题描述】:

我正在创建一个ListView,它作为TextViewImageView 作为列表项行。

最初我在列表视图视图中从本地数据库加载默认项目,我在列表视图顶部有一个 update button 以从服务器加载更多项目

当用户按下update button 时,我会触发AsyncTask,它会从服务器中提取图标网址和文本

要在 ImageView 中加载图标,我正在使用 ImageDownloader 的示例,但问题是我的 ImageView 与 ViewHolder 模式的旧 ImageViews bcoz 重叠。那么有人可以指出我做错了什么吗?

这是我的 ListView 适配器代码

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

                ViewHolder holder;
                TemplateData data = (TemplateData) this.getItem( position );

                if(convertView == null){
                    LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    convertView=inflater.inflate(R.layout.text_template_default_row, parent, false);

                    holder = new ViewHolder();
                    holder.templateText = (TextView) convertView.findViewById(R.id.defText);
                    holder.templateIcon = (ImageView)convertView.findViewById(R.id.defIcon);
                    holder.templateTitle = (TextView) convertView.findViewById(R.id.defTitle);

                    convertView.setTag(holder);

                }else{

                    holder = (ViewHolder)convertView.getTag();

                }


                holder.templateText.setText(data.getText() );
                holder.templateTitle.setText(data.getTemplateTitle());

                //isImageLoading initially sets to false so that default items will use the 
               // resource ids , it gets falsed when AsyncTask finished load Images and update the 
               //adapter and at that time this adapter has to pic the image from ImageDowloader
                if(!isImageLoading)
                    data.setTemplateIconId(iconList[position]);


                //Has resource id but not icon url
                if(data.getTemplateIconId()!=0 && data.getTemplateIconUrl()==null ){

                    Log.d("Load icon ","Default Load");

                    holder.templateIcon.setBackgroundResource(data.getTemplateIconId());



                // does not has recource id so load url from server
                }else if(data.getTemplateIconUrl()!=null && data.getTemplateIconId()==0){


                    Log.d("Load icon ","From Server Load");

                    imageDownloader.download(data.getTemplateIconUrl(), (ImageView) holder.templateIcon);



                }




                    return convertView;

         }

iconList 包含应用程序中现有图标的资源 ID。 请随时询问是否有人想要更多信息。

编辑

这是屏幕截图

最初将有 8 个模板及其图标,它们仅从存储在 android 手机中的数据库中加载。它的名字从模板 1 开始到模板 6

现在,当用户按下 更新 按钮时,新模板将在此处加载。它的名字从 template new 1 开始到 template new 9 但是当我向上滚动时 imageViews 会重叠

这里是截图

【问题讨论】:

  • 您能否提供正在发生的事情的屏幕截图?
  • @HandlerExploit 我已经更新了我的问题,请看一下

标签: android android-listview android-imageview


【解决方案1】:

我怀疑您的imageDownloader 正在调用setImageResource(或等效项——它正在设置ImageViewsrc 属性),而您最初调用的是setBackgroundResource。这可以解释重叠。

您需要做的是在以下代码中将setBackgroundResource 更改为setImageResource

 if(data.getTemplateIconId()!=0 && data.getTemplateIconUrl()==null ){

                Log.d("Load icon ","Default Load");

                // This line should say setImageResource:
                holder.templateIcon.setBackgroundResource(data.getTemplateIconId());
 } else ... 

如果下载需要很长时间并且视图已被重用,@Akos 提到的问题(他似乎已删除)对您来说将是一个问题。重申一下他所说的,一旦你通过上面的解决方案得到这个工作,你会发现如果一个图像下载需要很长时间(长到该行已经被重用,并且新的图像集)你的图像可能是被旧图像覆盖。

因此,在imageDownloader 里面你还要说,在下载之前:

imageView.setTag(url);

然后在下载完成后,在ImageView中设置图片之前:

if(!(String)imageView.getTag().equals(url)
{ 
     return; 
}

这样,如果ImageView同时被另一行重用,下载将简单中止。

【讨论】:

  • 你的意思是在 ImageDownloader 类中我应该将其设置为 if ((this == bitmapDownloaderTask) || (mode != Mode.CORRECT)) { String temp = (String)imageView.getTag(); if(!temp.equals(url)){ return; } imageView.setImageBitmap(bitmap); }
  • 是的。我不确定你的外部 if() 声明是做什么用的,但我假设那是基础设施。内部if()会在设置图片之前退出,如果它发现应该在ImageView中的图片不是它下载的图片。
猜你喜欢
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多