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

我正在使用基于本教程的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; } 

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

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

没有图片加载:

截图

如何加载图像:

截图

更新:

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

UPDATE2:

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

在我自己挣扎之后,我决定阻止后台线程是可以的(使用带有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; } 

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

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

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

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

这就是我使用它的方式

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

享受黄油平滑滚动:)

您可以使用目标回调来处理这样的问题

  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 } }); 

有关详细信息,请查看此文章