Picasso Library表格单元格中的图像不匹配

时间:2014-07-09 01:42:56

标签: java android picasso

我正在尝试修复我以前见过并在iOS上修复的问题,但我无法修复android。在iOS中,我使用SDWebImage library来下载和缓存图像。但是,当滚动一长串单元格时,图像会出现在错误的单元格中。通过执行以下操作,我无法解决此问题:

@property (weak) id <SDWebImageOperation> imageOperation;

...

- (void)setFriend:(TAGUser *)friend {
...
    self.imageOperation = [[SDWebImageManager sharedManager] downloadWithURL:[NSURL URLWithString:friend.profileImageUrl] options:SDWebImageRetryFailed
                                                                                progress:^(NSInteger receivedSize, NSInteger expectedSize) {

                                                                                } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) {

                                                                                    if(!error) {
                                                                                        self.profileImageView.image = image;
                                                                                    }
                                                                                }];
...
}

- (void)prepareForReuse {

    [super prepareForReuse];

    if (self.imageOperation) {
        [self.imageOperation cancel];
    }

    self.imageOperation = nil;
}

在Android上,我正在使用Picaso Libray并试图获得相同的结果:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View vi = convertView;
    if (vi == null) {
        vi = inflater.inflate(R.layout.friend_row, parent, false);
        ViewHolder holder = new ViewHolder();
        holder.friendImage = (ImageView) vi.findViewById(R.id.friend_image);
     }

     final ViewHolder holder = (ViewHolder) vi.getTag(); //Bad naming convention in my project I know, but it's a built-in method

     //THIS SHOULD IN THEORY CANCEL THE REQUEST OF THE OLD FRIEND URL
     Picasso.with(mActivity.getBaseContext()).cancelRequest(holder.friendImage);

     holder.friendImage.setImageDrawable(mActivity.getResources().getDrawable(R.drawable.background_circle));

     final TagUser user = (TagUser) getItem(position);

     Picasso.with(mActivity.getBaseContext()).load(user.getProfileUrl()).transform(new RoundedTransformation(ViewUtility.convertPxToDp(mActivity, 23), 0)).fit().into(holder.friendImage,
                            new Callback() {
                                @Override
                                public void onSuccess() {
                                    holder.friendInitials.setVisibility(View.INVISIBLE);
                                }

                                @Override
                                public void onError() {
                                    holder.friendInitials.setVisibility(View.VISIBLE);
                                }
                            });
}

即使调用cancelRequeset,配置文件图像仍然不匹配。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

您无需致电cancel。 Picasso会自动查看何时重复使用视图,并取消该图像视图的旧下载。

我还建议使用Picasso的.placeholder API作为背景圈。

当布局膨胀时,您似乎错过了对setTag的调用。希望这只是复制到帖子中的错误。

最后,创建RoundedTransformation一次,并为所有对毕加索的调用重复使用相同的实例。

最后,您的代码应如下所示:

private final Transformation roundTransform;
// Set the following in constructor:
// roundTransform = new RoundedTransformation(ViewUtility.convertPxToDp(mActivity, 23), 0)

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View vi = convertView;
    if (vi == null) {
        vi = inflater.inflate(R.layout.friend_row, parent, false);
        ViewHolder holder = new ViewHolder();
        vi.setTag(holder)
        holder.friendImage = (ImageView) vi.findViewById(R.id.friend_image);
     }

     final ViewHolder holder = (ViewHolder) vi.getTag(); //Bad naming convention in my project I know, but it's a built-in method
     final TagUser user = (TagUser) getItem(position);

     Picasso.with(mActivity)
         .load(user.getProfileUrl())
         .placeholder(R.drawable.background_circle)
         .transform(roundTransform)
         .fit()
         .into(holder.friendImage,
              new Callback() {
                  @Override
                  public void onSuccess() {
                      holder.friendInitials.setVisibility(View.INVISIBLE);
                  }

                  @Override
                  public void onError() {
                      holder.friendInitials.setVisibility(View.VISIBLE);
                  }
              });
}

答案 1 :(得分:-1)

我建议谷歌使用Volley。我已经在许多项目中使用它,即使我在3列gridView中有近1000张图像,也从未给出不匹配的结果。 Volley