毕加索:将图片加载到widget listview

时间:2014-07-16 02:32:18

标签: android listview android-widget picasso

我正在使用基于本教程的listview实现小部件:http://laaptu.wordpress.com/2013/07/24/populate-appwidget-listview-with-remote-datadata-from-web/(源代码:https://github.com/laaptu/appwidget-listview/tree/appwidget-listview2/)。

ListView项目包含文字&图像,用于图像加载我使用毕加索。

getViewAt实现:

public RemoteViews getViewAt(int position) {
    final RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.listview_item);
    ListItem listItem = listItemList.get(position);
    remoteView.setTextViewText(R.id.headline, listItem.headline);
    final String imageUrl = listItem.image;
    handler.post(new Runnable() {
        @Override
        public void run() {
            if (!Utils.isEmpty(imageUrl)) {
                picasso.load(imageUrl)
                        .placeholder(R.drawable.empty_photo)
                        .into(remoteView, R.id.picture, new int[] { appWidgetId });
            }
        }
    });

    return remoteView;
}

加载图片时,会破坏布局。

可能出现什么问题?或者我做错了什么?

没有图片加载:

screenshot

加载图片后如何看待:

screenshot

更新

如果我只是添加几个嵌套的远程视图(所有从一个布局中充气)

,也会发生同样的情况

UPDATE2:

报告了一个问题:https://github.com/square/picasso/issues/587

3 个答案:

答案 0 :(得分:21)

在我自己挣扎之后,我决定阻止后台线程正常(使用带有Picasso的.get())并且能够在我的适配器中使用以下内容:

    @Override
    public RemoteViews getViewAt(int position) {
        DBItem item = list.get(position);
        RemoteViews view = new RemoteViews(context.getPackageName(), R.layout.widget_item);
        try {
            Bitmap b = Picasso.with(context).load(item.getImageUrl()).get();
            view.setImageViewBitmap(R.id.widget_image, b);
        } catch (IOException e) {
            e.printStackTrace();
        }
        view.setTextViewText(R.id.widget_title, item.getTitle());
        return view;
    }

如果你知道回来的图像的大小(如果它总是相同或者你可以预测它),你可能想要做这样的事情以减少调整大小的抖动:

    @Override
    public RemoteViews getLoadingView() {
        return new RemoteViews(context.getPackageName(), R.layout.v2_widget_item_loading);
    }

性能非常流畅,没有负载紧张,我对结果非常满意。

答案 1 :(得分:14)

现在已经添加了这种支持,感谢广场上的好人

这就是我使用它的方式

Picasso.with(mContext)
.load(imagePath)
.into(remoteViews, R.id.some_id, new int[] {mAppWidgetId});

享受黄油平滑滚动:)

答案 2 :(得分:0)

您可以使用目标回调来解决您的问题

 Picasso.with(mContext)
                        .load(imageUrl)
                        .placeholder(R.drawable.defimage)
                        .into(new Target() {
                            @Override
                            public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                                mRemoteViews.setImageViewBitmap(R.id.myImage,bitmap);
                            }

                            @Override
                            public void onBitmapFailed(Drawable errorDrawable) {
                                //do something when loading failed 
                            }

                            @Override
                            public void onPrepareLoad(Drawable placeHolderDrawable) {
                               //do something while loading                                }
                        });

有关详细信息,请查看此article