2014-01-21 3 views
21

Ich benutze Volley-Bibliothek in meinem Projekt.Volley's NetworkImageView - setImageBitmap-Methode funktioniert nicht

lasse ich in der Regel die NetworkImageView Bilder herunterladen setImageUrl Methode:

networkImageView.setImageUrl(imageUrl, mImageLoader) 

Dies funktioniert gut, aber .. Wenn ich versuche, das Bitmap herunterladen „manuell“ Imageloader die get-Methode verwendet wird, und dann die Bitmap durch selbst, funktioniert es nicht:

mImageLoader.get(imageUrl,new ImageLoader.ImageListener() 
    { 
     @Override 
     public void onResponse(ImageLoader.ImageContainer imageContainer, boolean b) 
     { 
      if (imageContainer.getBitmap() != null) 
      { 
       networkImageView.setImageBitmap(imageContainer.getBitmap()); 
      } 
     } 

     @Override 
     public void onErrorResponse(VolleyError volleyError) 
     { 

     } 
    }); 

networkImageView.setImageBitmap (imageContainer.getBitmap()) Linie nichts tut.

Wie könnte es sein? Vielen Dank im Voraus!

+1

Wenn Sie das Bild manuell laden gehen, dann können Sie eine einfache Image verwenden und die Bitmap-Set dich selber. – Lefteris

Antwort

33

Diese Version von NetworkImageView behebt dieses Problem.

+0

funktioniert wie ein Charme! Vielen Dank! – dor506

+0

Auch für mich gearbeitet. Ich frage mich, warum NetworkImageView diese Probleme hat !! Danke trotzdem! +1 !! – voghDev

+0

hat Probleme. Obwohl es funktionierte, in einer Recycleransicht, wo jede Zeile eine Netzwerkbildansicht hat, zeigt es fälschlicherweise das Bild an. – Winster

3

Sie können erreichen, indem Sie einfach mehrere Zeilen Code im Quellcode von NetWorkImageView hinzufügen (Ich nehme an, Sie haben das Recht, den Quellcode zu bearbeiten, wenn Sie nicht können, können Sie NetWorkImageView erweitern, es ist ziemlich einfach).

public class NetworkImageView extends ImageView { 
    private Bitmap bitmap; 
    public void setLocalImageBitmap(Bitmap bitmap){ 
     this.bitmap=bitmap; 
    } 
    /**The volley verison of NetworkImageView has This method, you just need to add 
    a new condition, which is else if(bitmap!=null). 
    **/ 
    private void setDefaultImageOrNull() { 
    if(mDefaultImageId != 0) { 
     setImageResource(mDefaultImageId); 
    } 
    else if(bitmap!=null){ 
     setImageBitmap(bitmap); 
    } 
    else { 
     setImageBitmap(null); 
    } 
} 

}

0

Wie Lefteris erwähnt, verwenden Sie einfach ein normales ImageView, wenn Sie mit dem Hörerparadigma laden. Das hat für mich funktioniert.

0

Sie können auch Ihre lokale Bitmap durch das Bild-Loader und nicht berühren NetworkImageView

imageSaver = new ImageLoader(VolleyWebServiceManager.getInstance().getRequestQueue(), new ImageLoader.ImageCache() { 
     private final LruCache<String, Bitmap> mCache = new LruCache<String, Bitmap>(50); 

     public void putBitmap(String url, Bitmap bitmap) { 
      mCache.put(url, bitmap); 
      FileManager.getInstance().saveImage(bitmap, FileManager.getInstance().getLastPathComponent(url), true, false); 
     } 

     public Bitmap getBitmap(String url) { 
      // Puts the bitmap from the file system into the cache 
      if (mCache.get(url) == null && FileManager.getInstance().getLocalImage(FileManager.getInstance().getLastPathComponent(url)) != null) { 
       putBitmap(url, FileManager.getInstance().getLocalImage(FileManager.getInstance().getLastPathComponent(url))); 
      } 
      return mCache.get(url); 
     } 
    }); 
0

Erhalten NetworkImageView url es voll nutzen werden.

private static CustomVolleyRequestQueue mInstance; 
private static Context mCtx; 
private RequestQueue mRequestQueue; 
private ImageLoader mImageLoader; 


private CustomVolleyRequestQueue(Context context) { 
    mCtx = context; 
    mRequestQueue = getRequestQueue(); 

    mImageLoader = new ImageLoader(mRequestQueue, 
      new ImageLoader.ImageCache() { 
       private final LruCache<String, Bitmap> 
         cache = new LruCache<String, Bitmap>(20); 

       @Override 
       public Bitmap getBitmap(String url) { 
        return cache.get(url); 
       } 

       @Override 
       public void putBitmap(String url, Bitmap bitmap) { 
        cache.put(url, bitmap); 
       } 
      }); 
} 

public static synchronized CustomVolleyRequestQueue getInstance(Context context) { 
    if (mInstance == null) { 
     mInstance = new CustomVolleyRequestQueue(context); 
    } 
    return mInstance; 
} 

public RequestQueue getRequestQueue() { 
    if (mRequestQueue == null) { 
     Cache cache = new DiskBasedCache(mCtx.getCacheDir(), 10 * 1024 * 1024); 
     Network network = new BasicNetwork(new HurlStack()); 
     mRequestQueue = new RequestQueue(cache, network); 
     // Don't forget to start the volley request queue 
     mRequestQueue.start(); 
    } 
    return mRequestQueue; 
} 

public ImageLoader getImageLoader() { 
    return mImageLoader; 
} 
2

Die akzeptierte Antwort für mich nicht funktioniert hat ... Der folgende Code funktioniert:

public class CustomNetworkImageView extends NetworkImageView { 
    Context mContext; 
    public CustomNetworkImageView(Context context) { 
     super(context); 
     mContext = context; 
    } 

    public CustomNetworkImageView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
     mContext = context; 
    } 

    public CustomNetworkImageView(Context context, AttributeSet attrs, int defStyle){ 
     super(context, attrs, defStyle); 
     mContext = context; 
    } 

    @Override 
    public void setImageBitmap(Bitmap bm) { 
     if (bm == null) return; 
     setImageDrawable(new BitmapDrawable(mContext.getResources(), bm)); 
    } 
} 
Verwandte Themen