我的Android应用中有一个使用AppsAdapter
的列表视图
对于每一行。此适配器尝试从给定的URL加载图像并对其进行缓存。
这是适配器的图像加载方法的代码:
public View getView(int position, View convertView, ViewGroup parent) {
this.parent = parent;
View v;
ViewHolder vh;
v = buildView(convertView);
vh = findViews(v);
AppWithImage app = apps.get(position);
setData(vh, app);
return v;
}
private View buildView(View convertView) {
View v;
if (convertView != null) {
v = convertView;
} else {
LayoutInflater vi = (LayoutInflater) this.context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate((listMode) ? R.layout.item_apps_list : R.layout.item_apps_grid, null);
}
return v;
}
private void setData(ViewHolder vh, AppWithImage app) {
id = app.getId();
vh.appTitle.setText(app.getName());
vh.appRating.setRating((float) app.getRating());
if (app.getIcon() != null) {
vh.appIcon.setImage(app.getIcon());
} else {
vh.appIcon.setImage(noImageBitmap);
if (app.getIcon_url() != null && !app.getIcon_url().equals("")) {
loadBitmap(Constants.GET_IMAGE_ICON + app.getIcon_url());
}
}
vh.appIcon.setHasShadow(!listMode);
vh.id = app.getId();
}
Target target = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
// do something with the Bitmap
onFileLoaded(id, bitmap);
}
@Override
public void onBitmapFailed(Drawable drawable) {
Log.i("Bitmap", "Bitmap failed");
}
@Override
public void onPrepareLoad(Drawable drawable) {
Log.i("Prepare", "Bitmap failed");
}
};
public void loadBitmap(String url) {
Picasso.with(context).load(url).into(target);
}
由于我没有使用Image视图,我需要使用一个Target实例来处理我的位图并制作它的东西。问题是我第一次运行应用程序时始终从Picasso调用onPrepareLoad
方法,但是没有从URL返回任何内容,因此我的列表中没有图像。
我第二次运行它运行正常。即使我第一次滚动,android也会在完成下载后完美地加载图像。
我一直在检查Picasso的源代码,我看到它在缓存失败时加入URL的位图,我认为这可能是我的问题,因为当它从URL加载流时适配器和目标实例基本消失了。
如何解决这个问题才能达到onBitmapLoaded
方法?