在列表适配器中使用Picasso的Android异步加载图像

时间:2014-11-23 14:27:04

标签: android image asynchronous bitmap picasso

我的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方法?

0 个答案:

没有答案