2012-08-16 53 views
3

我正在创建一个ListView,其中TextViewImageView作为列表项行。ImageView在现有ListVIew中添加更多项目时重叠

最初我加载从本地数据库默认项在ListView观点和我对列表视图顶部从服务器

加载多个项目的update button当用户按下一个update button我正在烧制AsyncTask其拉来自服务器的图标URL和文本

在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

现在,当用户按下更新按钮新模板将在这里被加载。它的名字从模板创建新1开始模板创建新9但imageViews被重叠时,我向上滚动N个了

这里是屏幕截图

enter image description here

+0

你能提供正在发生的事情的截图吗? – HandlerExploit 2012-08-17 19:42:22

+0

@HandlerExploit我已经更新了我的问题请看看它 – Hunt 2012-08-17 20:44:52

回答

4

我怀疑你imageDownloader呼唤setImageResource(或相当于 - 它在设置src属性)ImageView,而您最初呼叫setBackgroundResource。这将解释重叠。

你需要做的是改变setBackgroundResourcesetImageResource在下面的代码:

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已被另一行重新使用,则下载将简单地中止。

+0

你的意思是在一个ImageDownloader类中,我应该将它设置为'if((this == == bitmapDownloaderTask)||(mode!= Mode.CORRECT)){ \t \t String temp =(String)imageView.getTag(); (!temp.equals(url)) \t \t \t \t return; \t} imageView.setImageBitmap(bitmap); }' – Hunt 2012-08-18 19:58:46

+0

是的。我不确定你的外部'if()'语句是什么,但我只是假设这是基础设施。如果发现应该在“ImageView”中的图像不是它下载的图像,内部'if()'将在设置图像之前退出。 – 2012-08-20 14:57:05