Picasso: загружать изображения в список виджетов

Я реализую виджет со списком на основе этого учебника: 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

После того, как я боролся с этим сам, я решил, что блокировка фонового потока была в порядке (используя .get () с Picasso) и смог заставить следующее работать внутри моего адаптера:

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

Производительность очень плавная, без лишних нагрузок, я доволен результатом.

Эта поддержка была добавлена ​​сейчас, благодаря великолепным парням на площади

Вот как я его использовал

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

Для более подробной информации проверьте эту статью