Android 毕加索:将图像加载到小部件列表视图
我正在基于本教程使用listview实现小部件:(源代码:) ListView项包含文本和图像,对于图像加载,我使用毕加索 getViewAt实现:Android 毕加索:将图像加载到小部件列表视图,android,listview,android-widget,picasso,Android,Listview,Android Widget,Picasso,我正在基于本教程使用listview实现小部件:(源代码:) ListView项包含文本和图像,对于图像加载,我使用毕加索 getViewAt实现: public RemoteViews getViewAt(int position) { final RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.listview_item); ListItem listItem = list
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;
}
加载图像时,它会破坏布局
可能存在什么问题?或者我做错了什么
无图像加载:
加载图像后的外观:
更新:
如果我只添加几个嵌套的远程视图(所有视图都从一个布局中膨胀),也会发生同样的情况
更新2:
报告了一个问题:在我自己努力解决这个问题之后,我决定阻止后台线程是可以的(使用毕加索的.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);
}
性能非常平稳,没有加载抖动,我对结果非常满意。感谢square的优秀人员,现在已经添加了此支持 我就是这样用的
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 }
});
有关更多详细信息,请检查此@ab。helly yes您的答案正确。不幸的是,这在listview中不起作用,因为毕加索需要调用主线程。在listview远程服务中,您的应用程序已在后台线程上。我也解决了这个问题,将缓存的位图存储在地图中,并以这种方式提供它们。我最初使用毕加索和调整大小来获得它们,以确保最佳性能。如何在远程视图工厂中获得mAppWidgetId,例如列表视图目标将很快被垃圾收集。毕加索对目标的引用很弱。只要你想让你的目标活下去,你就应该保持对它的引用。我应该说,在我的情况下,它的表现很糟糕。但是我+1这个答案,因为它只是需要一点改进。在调用.get()之前调用.fetch(),这样对同一图片的后续调用(当用户上下滚动时)将足够快。