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

ab.*_*lly 13 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项目包含文本和图像,对于图像加载我使用Picasso.

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;
}
Run Code Online (Sandbox Code Playgroud)

加载图像时,它会破坏布局.

什么可能是一个问题?或者我做错了什么?

没有图片加载:

截图

如何加载图像:

截图

更新:

如果我只是添加几个嵌套的远程视图(所有从一个布局中充气),也会发生同样的情况

UPDATE2:

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

wbl*_*hko 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;
    }
Run Code Online (Sandbox Code Playgroud)

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

    @Override
    public RemoteViews getLoadingView() {
        return new RemoteViews(context.getPackageName(), R.layout.v2_widget_item_loading);
    }
Run Code Online (Sandbox Code Playgroud)

性能非常流畅,没有负载抖动,我对结果非常满意.


nga*_*uks 15

由于广场上的伟大人物,现在已经添加了这种支持

这就是我使用它的方式

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

享受黄油平滑滚动:)