不匹配的图像在表单元格与毕加索图书馆



我试图修复一个问题,我已经看到以前和固定在iOS上,但无法修复在android上。在iOS中,我使用SDWebImage库来下载和缓存图像。然而,当滚动一长串单元格时,图像会出现在错误的单元格中。我可以通过以下操作来解决这个问题:

@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上,我正在使用毕加索图书馆,并试图达到相同的结果,如:

@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被调用,配置文件图像仍然不匹配。任何帮助将非常感激!

您不需要调用cancel。当视图被重新使用时,Picasso会自动查看,并将取消该图像视图的旧下载。

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

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

最后,创建一次RoundedTransformation,并为所有对Picasso的调用重用同一个实例。

最后你的代码应该是这样的:
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);
                  }
              });
}

我建议使用Google的Volley。我在许多项目中使用过它,即使我在3列gridView中有近1000张图像,它也不会给出不匹配的结果。凌空

最新更新