Android ListView图片异步加载时,图片错位的问题


listview 异步加载图片之所以错位的根本原因是重用了 convertView   最简单的解决方法就是网上说的,给 ImageView 设置一个 tag, 并预设一个图片。

当 Item1 比 Item8 图片下载的快时, 你滚下去使 Item8 可见,这时 ImageView 的 tag 被设成了

Item8 的 URL, 当 Item1 下载完时,由于 Item1 不可见现在的 tag 是 Item8 的 URL,所以不满足条件,

虽然下载下来了但不会设置到 ImageView 上, tag 标识的永远是可见 view 中图片的 URL。



public View getView(int position, View convertView, ViewGroup parent) {
      ViewHolder holder = null;

      if (convertView == null) {
          holder = new ViewHolder();
          convertView = LayoutInflater.from(context).inflate(
                  R.layout.list_item, null);
          holder.img = (ImageView) convertView.findViewById(R.id.userimage);

          convertView.setTag(holder);
      } else {
          holder = (ViewHolder) convertView.getTag();
      }

      User user = list.get(position);

      // 给 ImageView 设置一个 tag
      holder.img.setTag(user.getImgUrl());
      // 预设一个图片
      holder.img.setImageResource(R.drawable.ic_launcher);

      final String tmpImageUrl = user.getImgUrl();

      if (user.getImgUrl() != null && !user.getImgUrl().equals("")) {
          Bitmap bitmap = imageLoader.loadImage(holder.img, user.getImgUrl(),
                  new ImageDownloadCallBack() {

                      @Override
                      public void onImageDownloaded(ImageView imageView,
                              Bitmap bitmap) {
                          // 通过 tag 来防止图片错位
                          if (imageView.getTag() != null
                                  && imageView.getTag().equals(tmpImageUrl)) {
                              imageView.setImageBitmap(bitmap);
                          }
                      }
                  });

          if (bitmap != null) {
              holder.img.setImageBitmap(bitmap);
          }
      }

      return convertView;
  }



你可能感兴趣的:(Android ListView图片异步加载时,图片错位的问题)