2014-07-16 524 views
11

我正在实现基于本教程的列表视图的小部件: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

UPDATE:

同样的情况,如果我只是添加很少有嵌套的远程视图(所有的虚拟视图都膨胀)一个布局)

UPDATE2:

报告的问题:https://github.com/square/picasso/issues/587

回答

18

与这个自己挣扎后,我决定,阻断后台线程是确定的(使用获得()与毕加索),并能得到我的转接器内的工作如下:

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

表现非常流畅,没有加载抖动,我对这个结果非常满意。

12

这种支持已经现在又增加了,这要感谢伟大的球员在广场

这是怎么了,我用它

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

享受黄油平滑滚动:)

+1

奇怪,问题仍然是开放的:) https://github.com/square/picasso/issues/587 –

+1

@ ab.helly是您正确的。遗憾的是,这在列表视图中不起作用,因为毕加索需要回调主线程。在listview远程服务中,你已经在后台线程中。我也解决了这个问题,将缓存的位图存储在地图中并以此方式提供服务。我最初让他们使用毕加索并调整大小以确保最佳性能。 – ngatirauks

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

+0

该目标将非常快速地收集垃圾。毕加索对目标只有微弱的参照。只要你想要它活着,你应该持有一个你的目标的参考。 –

+0

它适用于我。 – 3zcs