2015-02-10 74 views
4

我正在使用毕加索将一些图像从联机加载到listView中。问题是,虽然一些图像被成功加载,但有些只是简单的消失。毕加索无法加载某些URL的图像(无特殊字符)

成功(成功显示品牌形象):

enter image description here

失败(无品牌形象所示,失败):当它失败

enter image description here

的ImageView的消失。这里是我的代码:

Picasso.with(mContext) 
.load(UrlEncoder.encode(interiorDesign.getBrand_image_url())) 
.config(Bitmap.Config.RGB_565) 
.error(R.drawable.blank) 
.fit() 
.centerInside() 
.into(holder.brand); 

这里是我的.xml文件:

<LinearLayout 
android:layout_width="match_parent" 
     android:layout_height="90dp" 
     android:paddingLeft="10dp" 
     android:paddingRight="10dp" 
     android:layout_alignParentLeft="true" 
     android:gravity="center_vertical" 
     android:orientation="horizontal"> 

<RelativeLayout 
android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:paddingRight="10dp"> 
... 
</RelativeLayout> 

<ImageView 
android:layout_width="200dp" 
     android:layout_height="90dp" 
     android:paddingBottom="10dp" 
     android:id="@+id/partial_interior_design_brand" /> 
</LinearLayout> 

我已经检查了它,因为它捕获在毕加索的错误()方法的错误失败。

Here是失败的链接。

Here是另一个失败的链接。

Here是一个成功的链接。

这个问题发生在我身上好几次了。我怀疑问题在于fit()和centerInside()方法,因为在我删除这两个方法之后,问题就解决了。然而,如果没有这两种方法,我的图像根本不适合这个尺寸。

+0

只要使用这个毕加索.with(mContext).load(interiorDesign.getBrand_image_url()).config(Bitmap.Config.RGB_565) .error(R.drawable.blank) .fit() .centerInside() .into(holder.brand); – 2015-02-10 10:07:15

+2

我测试过了。它不起作用。我切换到通用图像加载器,最终解决了问题。我不知道毕加索出了什么问题。我遇到过这样的问题很多。 – Derekyy 2015-02-10 16:26:56

+0

那么你切换到一个更好的图书馆:) – 2015-02-11 06:34:40

回答

0

我使用的是毕加索这样的,它总是加载我的图片:

if (imageURL != null) { 
    Picasso.with(getContext()).load(imageURL).error(R.drawable.ic_missing) 
    .into(ivThumbnail); 

我的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@drawable/itemview_campaign_background" 
    android:orientation="vertical" 
    android:paddingBottom="5dp" 
    android:paddingLeft="10dp" 
    android:paddingRight="10dp" > 

    <ImageView 
     android:id="@+id/ivThumbnail" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1"/> 

... // More stuff 
0

除了切换到通用图像装载机,我发现这另一种解决方案,通过使用Picasso中的Transform()方法,并将位图的targetHeight指定为ImageView的高度。由于CenterInside只是意味着位图必须完全位于imageView中,我还要检查targetWidth(缩放后)是否大于imageView的宽度。如果是这样,我使用targetWidth作为参考点而不是targetHeight。

  Picasso.with(mContext) 
        .load(url) 
        .transform(new Transformation() { 
         @Override 
         public Bitmap transform(Bitmap source) { 
          int targetHeight = dpToPx(height_dp); 
          double aspectRatio = (double) source.getHeight()/(double) source.getWidth(); 
          int targetWidth = (int) (targetHeight/aspectRatio); 
          if (targetWidth > dpToPx(width_dp)) { 
           targetWidth = dpToPx(width_dp); 
           targetHeight = (int) (targetWidth * aspectRatio); 
          } 
          Bitmap result = Bitmap.createScaledBitmap(source, targetWidth, targetHeight, false); 
          if (result != source) { 
           // Same bitmap is returned if sizes are the same 
           source.recycle(); 
          } 
          return result; 
         } 

         @Override 
         public String key() { 
          return "transformation" + " desiredWidth"; 
         } 
        }) 
        .into(imageView); 

private int dpToPx(int dp) { 
    float density = Resources.getSystem().getDisplayMetrics().density; 
    return Math.round((float) dp * density); 
} 

编辑: 经过测试,我发现这种方法在某些情况下不起作用。仍然找出解决方案。

2

嘿尝试只是concavanate你的网址“http://”。由于某种原因,picassa不会在没有http://的情况下加载图片。 所以只是接下来的事情尽量

Picasso.with(mContext) 
.load("http://".concatenate(url)) 
.config(Bitmap.Config.RGB_565) 
.error(R.drawable.blank) 
.fit() 
.centerInside() 
.into(holder.brand); 
0

没有必要使用URLEncoder的

.load(UrlEncoder.encode(interiorDesign.getBrand_image_url()))

只是URL的字符串

.load(interiorDesign.getBrand_image_url())