我正在使用基于本教程的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;
}
加载图片时,会破坏布局。
可能出现什么问题?或者我做错了什么?
没有图片加载:
加载图片后如何看待:
更新
如果我只是添加几个嵌套的远程视图(所有从一个布局中充气)
,也会发生同样的情况UPDATE2:
答案 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