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

来源:互联网 发布:网络运营商劫持 编辑:程序博客网 时间:2024/06/05 11:19
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;          }      }  } 


0 0
原创粉丝点击