ListView异步加载图片时出现错位的解决方案

1.

解决方案:

通过上面的分析我们知道了出现错乱的原因是异步加载及对象被复用造成的,如果每次getView能给对象一个标识,在异步加载完成时比较标识与当前行Item的标识是否一致,一致则显示,否则不做处理即可。

原理:首先给ImageView设置一个Tag,这个Tag中设置的是图片的url,然后在加载的时候取得这个url和要加载那position中的url对比,如果不相同就加载,相同就是复用以前的就不加载了。

给ImageView设置一个标签

      @Override  
        public Object getItem(int position) {  
            return URLS[position];  
        }  
  
        @Override  
        public long getItemId(int position) {  
            return position;  
        }  
  
        @Override  
        public View getView(int position, View convertView, ViewGroup parent) {  
            //只有当convertView不存在的时候才去inflate子元素  
            if (convertView == null) {  
                convertView = getLayoutInflater().inflate(R.layout.single_data,  
                        null);  
                 mHolder = new ViewHolder();  
                 mHolder.mImageView = (ImageView) convertView.findViewById(R.id.image_view);  
                 mHolder.mTextView = (TextView) convertView.findViewById(R.id.text_view);  
                 convertView.setTag(mHolder);  
            }else {  
             mHolder = (ViewHolder) convertView.getTag();  
             }  
            final String url = URLS[position];  
             mHolder.mTextView.setText(url != null ? url.substring(url.lastIndexOf("/") + 1) : "");  
             mHolder.mImageView.setTag(URLS[position]);  
            if (mDownloader == null) {  
                mDownloader = new ImageDownloader();  
            }  
            //这句代码的作用是为了解决convertView被重用的时候,图片预设的问题  
            mHolder.mImageView.setImageResource(R.drawable.ic_launcher);  
            if (mDownloader != null) {  
                //异步下载图片  
                mDownloader.imageDownload(url, mHolder.mImageView, "/yanbin",MainActivity.this, new OnImageDownload() {  
                            @Override  
                            public void onDownloadSucc(Bitmap bitmap,  
                                    String c_url,ImageView mimageView) {  
                                ImageView imageView = (ImageView) mListView.findViewWithTag(c_url);  
                                if (imageView != null) {  
                                    imageView.setImageBitmap(bitmap);  
                                    imageView.setTag("");  
                                }   
                            }  
                        });  
            }  
            return convertView;  
  
        }  
  
        /** 
         * 使用ViewHolder来优化listview 
         * @author yanbin 
         * 
         */  
        private class ViewHolder {  
            ImageView mImageView;  
            TextView mTextView;  
        }  
    }  
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值