2014-07-16 23 views
11

Tôi đang triển khai tiện ích với chế độ xem danh sách dựa trên hướng dẫn này: http://laaptu.wordpress.com/2013/07/24/populate-appwidget-listview-with-remote-datadata-from-web/ (mã nguồn: https://github.com/laaptu/appwidget-listview/tree/appwidget-listview2/).Picasso: tải hình ảnh vào chế độ xem danh sách widget

Mục danh sách xem chứa văn bản & hình ảnh, để tải hình ảnh tôi sử dụng Picasso.

getViewAt thực hiện:

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

Khi hình ảnh được nạp, nó phá vỡ bố cục.

Điều gì có thể là vấn đề có thể xảy ra? Hay tôi đang làm gì sai?

Nếu không có hình ảnh tải:

screenshot

Làm thế nào nó trông sau khi hình ảnh được tải:

screenshot

UPDATE:

Cùng xảy ra nếu tôi chỉ cần thêm một vài chế độ xem từ xa lồng nhau (tất cả được tăng từ một layout)

UPDATE2:

Báo cáo sự cố: https://github.com/square/picasso/issues/587

Trả lời

18

Sau khi đấu tranh với bản thân mình, tôi quyết định rằng ngăn chặn các sợi nền là ok (sử dụng .get() với Picasso) và là có thể làm như sau để hoạt động bên trong bộ điều hợp của tôi:

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

Nếu bạn biết kích thước của hình ảnh trở lại (nếu nó luôn giống hoặc bạn có thể dự đoán), bạn có thể muốn làm gì đó ing như thế này cũng như để cắt giảm kích thước jitters:

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

Hiệu suất rất trơn tru, không tải jitters, tôi khá hài lòng với kết quả.

12

Sự hỗ trợ này đã được thêm vào bây giờ, nhờ vào các chàng trai tuyệt vời tại vuông

Đây là cách tôi đã sử dụng nó

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

Thưởng thức di chuyển mượt mà bơ :)

+1

lạ, vấn đề vẫn còn mở :) https://github.com/square/picasso/issues/587 –

+1

@ ab.helly có đúng. Điều này không làm việc trong một listview tiếc là Picasso cần phải gọi trở lại vào chủ đề chính. Trong một dịch vụ từ xa listview, bạn đã có một chủ đề nền.Tôi cũng đã làm việc xung quanh việc này, bằng cách lưu trữ các bitmap được lưu trong bộ nhớ cache trong một bản đồ và phục vụ chúng theo cách đó. Ban đầu tôi nhận được chúng bằng cách sử dụng Picasso và thay đổi kích thước để đảm bảo hiệu suất tối ưu. – ngatirauks

0

bạn có thể sử dụng Gọi lại mục tiêu để xử lý vấn đề của mình như thế này

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

để biết thêm chi tiết, hãy kiểm tra điều này article

+0

Mục tiêu đó sẽ thu gom rác thật nhanh. Picasso chỉ giữ một tham chiếu yếu đến Mục tiêu. Bạn nên giữ một tham chiếu đến Target của bạn miễn là bạn muốn nó sống. –

+0

Nó hoạt động với tôi. – 3zcs

Các vấn đề liên quan