我试图修复一个问题,我已经看到以前和固定在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张图像,它也不会给出不匹配的结果。凌空