gpt4 book ai didi

android - 在现有 ListVIew 中添加更多项目时 ImageView 重叠

转载 作者:太空宇宙 更新时间:2023-11-03 13:31:56 25 4
gpt4 key购买 nike

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

最初我在 ListView View 中从本地数据库加载默认项目,我在 ListView 顶部有一个更新按钮以从服务器加载更多项目

当用户按下更新按钮时,我会触发一个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

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

这是截图

enter image description here

最佳答案

我怀疑您的 imageDownloader 正在调用您的 ImageView,当您最初调用 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 提到的问题(他似乎已删除)如果下载需要很长时间并且 View 已被重用,则对您来说将是一个问题。重申一下他所说的,一旦你通过上面的解决方案得到这个工作,你会发现如果图像下载需要很长时间(太长以至于该行已经被重新使用,并且新的图像集)你的图像可能是用旧图像覆盖。

因此,在 imageDownloader 中,您还需要在下载之前说:

imageView.setTag(url);

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

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

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

关于android - 在现有 ListVIew 中添加更多项目时 ImageView 重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11994233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com