在 ListFragment 内,我有一个 ListView,其中包含图像和一些文本(请参阅上一个已解决的问题)
我短暂地设法使该问题的解决方案起作用,但它现在停止工作。我正在AsyncTask
通过更新适配器加载图像位图adapter.notifyDataSetChanged();
当他们完成下载时,我将位图存储在一个类成员中:命名位图数组ICONS[]
,我直接从 ArrayAdapter 访问以节省内存。
进行了各种检查以确保我不会多次下载图像,所有这些都可以正常工作,但无论如何我都会在这里添加它们:
注意i
这里是 ListView 中的每个条目
ICONS[i] = null
i
直到它们被下载并成为ICONS[i]
位图图像。
iconSet[i] = false
对于所有人,直到图像被下载并设置(在适配器内更新),如果它已经设置i
,这将停止重置。ImageView Bitmap
iconDownloading[i] = false
i
直到下载器AsyncTask
启动
iconDownloaded[i] = false
i
直到 AsyncTask 下载器完成
private class ArticleAdapter extends ArrayAdapter<String>{
private final Context context;
private final String[] values;
public ArticleAdapter(Context context, String[] values) {
super(context, R.layout.list_entry, values);
this.context=context;
this.values=values;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.list_entry,parent,false);
TextView tv = (TextView) rowView.findViewById(R.id.label);
tv.setText(values[position]);
if(ICONS[position]!=null&&!iconSet[position]){//not null and not set
iconSet[position]=true;
System.out.println("ArticleListFragment: Page " + pageIndex + " Setting icon " + position);
ImageView iv = (ImageView) rowView.findViewById(R.id.logo);
iv.setImageBitmap(ICONS[position]);
}else if(!iconDownloading[position]&&!iconDownloaded[position]){
iconDownloading[position]=true;//Starting download
String iconUrl = ARTICLE_LIST.getArticle(position).getThumbnail();
if(iconUrl!=null&&!iconUrl.equals("")){
System.out.println("ArticleListFragment: Page " + pageIndex + " Downloading icon " + position);
new LoadThumbnail(position, iconUrl).execute();
}else{
System.out.println("ArticleFragment: Article " + position + " has no icon");
}
}
//iv.setImageResource(resId);//Change Image - All set to sport at the moment
return rowView;
}
}
我还添加了一些 System.out 调用,以检查一切是否按正确的顺序完成,如预期的那样:
System.out.println("ArticleListFragment: Page " + pageIndex + " Downloading icon " + position);
首先是:
System.out.println("ArticleListFragment: Page " + pageIndex + " Setting icon " + position);
哪个在位图设置之前,所以它使用正确的位图到达正确的点(我假设我已经使用ICONS[position].size()
了输出大约 4000 个字节)所以我想知道出了什么问题?
编辑
我已经将问题缩小到检查if(!iconSet[position])
我是否删除了这个位图是否正确加载,但是每次将另一个位图添加到 ICONS 数组时都会重新加载它们,这出于某种原因会if
为 2 个图标触发 4 次该语句。
为什么要执行 4 次?(每行条目两次)为什么该检查会有所作为?