我正在创建ListView
作为列表项行TextView
和ImageView
。
最初我在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
现在,当用户按更新按钮时,将在此处加载新模板。它的名称从模板new 1开始到模板new 9但是当我向上滚动n时,imageViews会重叠
这是屏幕截图
答案 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;
}
在此期间被另一行重用,则下载将会中止。