0

在 ListFragment 内,我有一个 ListView,其中包含图像和一些文本(请参阅上一个已解决的问题

我短暂地设法使该问题的解决方案起作用,但它现在停止工作。我正在AsyncTask通过更新适配器加载图像位图adapter.notifyDataSetChanged();

当他们完成下载时,我将位图存储在一个类成员中:命名位图数组ICONS[],我直接从 ArrayAdapter 访问以节省内存。

进行了各种检查以确保我不会多次下载图像,所有这些都可以正常工作,但无论如何我都会在这里添加它们:

注意i这里是 ListView 中的每个条目

ICONS[i] = nulli直到它们被下载并成为ICONS[i]位图图像。

iconSet[i] = false对于所有人,直到图像被下载并设置(在适配器内更新),如果它已经设置i,这将停止重置。ImageView Bitmap

iconDownloading[i] = falsei直到下载器AsyncTask启动

iconDownloaded[i] = falsei直到 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 次?(每行条目两次)为什么该检查会有所作为?

4

0 回答 0