在现有ListVIew中添加更多项目时,ImageView会重叠

时间:2012-08-16 19:37:05

标签: android android-listview android-imageview

我正在创建ListView作为列表项行TextViewImageView

最初我在listview视图中从本地数据库加载默认项目,并且我在listview顶部有一个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

default view

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

这是屏幕截图

enter image description here

1 个答案:

答案 0 :(得分:4)

我怀疑您的imageDownloader正在呼叫setImageResource(或等效 - 它正在设置src属性),而您最初正在呼叫ImageView }}。这可以解释重叠。

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

setImageResource

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

因此,在 if(data.getTemplateIconId()!=0 && data.getTemplateIconUrl()==null ){ Log.d("Load icon ","Default Load"); // This line should say setImageResource: holder.templateIcon.setBackgroundResource(data.getTemplateIconId()); } else ... 之内,你还要在下载之前说:

imageDownloader

然后在下载完成后,在imageView.setTag(url);

中设置图像之前
ImageView

这样,如果if(!(String)imageView.getTag().equals(url) { return; } 在此期间被另一行重用,则下载将会中止。