【问题标题】:Volley's NetworkImageView - setImageBitmap method doesn't workVolley 的 NetworkImageView - setImageBitmap 方法不起作用
【发布时间】:2014-01-21 22:12:48
【问题描述】:

我在我的项目中使用 volley 库。

我通常让 NetworkImageView 使用 setImageUrl 方法下载图片:

networkImageView.setImageUrl(imageUrl, mImageLoader)

这很好,但是..当我尝试使用 ImageLoader 的 get 方法“手动”下载位图,然后自己设置位图时,它不起作用:

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()) 行什么都不做。

怎么可能? 提前致谢!

【问题讨论】:

  • 如果您要手动加载图像,那么您可以使用简单的 ImageView 并自行设置位图。

标签: android android-volley


【解决方案1】:

这个版本的NetworkImageView 修复了这个问题。

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

}

【讨论】:

  • 也为我工作。我想知道为什么 NetworkImageView 有这些问题!!不管怎么说,还是要谢谢你! +1!!
  • 有问题。虽然它有效,但在每行都有一个网络图像视图的回收器视图中,它错误地显示了图像
  • 同样,我们可以添加一个方法来使 ImageView 的 setImageUri() 方法能够工作。如下: public void setLocalImageUri(Uri uri) { if (uri != null) { mShowLocalUri = true; } this.uri = uri;请求布局(); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); if(mShowLocalUri) { setImageURI(uri); } }
【解决方案2】:

你可以通过在NetWorkImageView的源代码中添加几行代码来实现(我想你有权编辑源代码,如果你不能,你可以扩展NetWorkImageView,很容易) .

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

}

【讨论】:

    【解决方案3】:

    接受的答案对我不起作用...以下代码有效:

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

    【讨论】:

      【解决方案4】:

      正如 Lefteris 所提到的,如果您使用侦听器范例加载,只需使用普通的 ImageView。这对我有用。

      【讨论】:

        【解决方案5】:

        您也可以通过图像加载器设置本地位图,而不是触摸 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);
                }
            });
        

        【讨论】:

          【解决方案6】:

          获取它将使用完整的 NetworkImageView url。

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

          【讨论】:

            猜你喜欢
            • 2015-11-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-09-02
            相关资源
            最近更新 更多