NetworkImageView de Volley – el método setImageBitmap no funciona

Estoy utilizando volley biblioteca en mi proyecto.

Normalmente, permito que el NetworkImageView descargar imágenes usando el método setImageUrl:

networkImageView.setImageUrl(imageUrl, mImageLoader) 

Esto funciona bien, pero .. Cuando intento descargar el mapa de bits "manualmente" utilizando el método Get de ImageLoader y, a continuación, establecer el mapa de bits por mí mismo, no funciona:

 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 ()) línea no hace nada.

¿Como puede ser? ¡Gracias por adelantado!

Esta versión de NetworkImageView corrige este problema.

 public class CustomNetworkImageView extends NetworkImageView { private Bitmap mLocalBitmap; private boolean mShowLocal; public void setLocalImageBitmap(Bitmap bitmap) { if (bitmap != null) { mShowLocal = true; } this.mLocalBitmap = bitmap; requestLayout(); } @Override public void setImageUrl(String url, ImageLoader imageLoader) { mShowLocal = false; super.setImageUrl(url, imageLoader); } public CustomNetworkImageView(Context context) { this(context, null); } public CustomNetworkImageView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CustomNetworkImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); if (mShowLocal) { setImageBitmap(mLocalBitmap); } } } 

Usted puede lograr que simplemente agregando varias líneas de código en el código fuente de NetWorkImageView (supongo que tiene el derecho de editar el código fuente, si no puede, se puede ampliar NetWorkImageView, es bastante fácil).

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

}

La respuesta aceptada no funcionó para mí … El código siguiente funciona:

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

Como Lefteris mencionó, sólo tiene que usar un ImageView normal si está cargando con el paradigma oyente. Esto funcionó para mí.

También puede establecer su mapa de bits local a través del cargador de imágenes y no tocar 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); } }); 

Obtenga la URL de NetworkImageView que utilizará.

 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; } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.