2014-07-16 13 views
11

Wprowadzam widget z listview na podstawie tego samouczka: http://laaptu.wordpress.com/2013/07/24/populate-appwidget-listview-with-remote-datadata-from-web/ (kod źródłowy: https://github.com/laaptu/appwidget-listview/tree/appwidget-listview2/).Picasso: ładowanie obrazów do widżetu listview

Element ListView zawiera tekst & obraz do załadowania obrazu Używam Picasso.

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

Gdy obraz załadowany, to łamie układ.

Jaki może być potencjalny problem? Albo co robię źle?

Bez obrazu ładowania:

screenshot

Jak to wygląda po załadowaniu obrazu:

screenshot

UPDATE:

To samo dzieje się, jeśli po prostu dodać kilka zagnieżdżonych widoków zdalnych (wszystkie są zawyżone) jeden układ)

Update2:

zgłosił problem: https://github.com/square/picasso/issues/587

Odpowiedz

18

Po zmaga się z tym, postanowiłem, że zablokowanie wątku tła było ok (używając .get() z Picasso) i był w stanie uzyskać następujące do pracy wewnątrz mojego adaptera:

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

Jeżeli znasz rozmiar obrazu pochodzącego z powrotem (jeśli jest to zawsze takie same lub można ją przewidzieć), może chcesz zrobić someth ing tak jak dobrze, aby obniżyć zmiany rozmiaru trema:

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

Wydajność jest bardzo gładka, bez trema ładowanie, jestem bardzo zadowolony z wyniku.

12

Wsparcie to zostało dodane teraz, dzięki wielkich facetów na placu

ten sposób Używałem go

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

Ciesz maślany płynne przewijanie :)

+1

dziwne, problem jest nadal otwarty :) https://github.com/square/picasso/issues/587 –

+1

@ ab.helly tak poprawny. To nie działa w widoku listy, ponieważ Picasso musi oddzwonić do głównego wątku. W zdalnej usłudze widoku listy, twój już wątek w tle.Pracowałem również nad tym, przechowując buforowane bitmapy na mapie i obsługując je w ten sposób. Pierwotnie otrzymałem je za pomocą Picassa i zmieniono rozmiar, aby zapewnić optymalną wydajność. – ngatirauks

0

można użyć funkcji docelowego oddzwaniania, aby obsłużyć taki problem:

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

więcej szczegółów to sprawdzić article

+0

Ten cel szybko zbierze śmieci. Picasso ma słabe odniesienie do celów. Powinieneś trzymać odniesienie do swojego celu tak długo, jak chcesz żyć. –

+0

Działa ze mną. – 3zcs