我正在尝试修复我以前见过并在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
,配置文件图像仍然不匹配。任何帮助将不胜感激!
答案 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