Android截取-加载图像时在listview适配器中显示进度条

Android截取-加载图像时在listview适配器中显示进度条,android,android-listview,android-volley,Android,Android Listview,Android Volley,我试图通过listview项目中的Volley从网络获取图像。下载图像时,进度条显示,完成后应隐藏 这是我的适配器: public class NewsAdapter extends CursorAdapter{ public NewsAdapter(Context context, Cursor c) { super(context, c, true); } @Override public Cursor getItem(int position) { return

我试图通过listview项目中的
Volley
从网络获取图像。下载图像时,进度条显示,完成后应隐藏

这是我的适配器:

   public class NewsAdapter  extends CursorAdapter{
public NewsAdapter(Context context, Cursor c) {
    super(context, c, true);
}

@Override
public Cursor getItem(int position) {
    return (Cursor) super.getItem(position);
}

@Override
public void bindView(View view, final Context context, Cursor cursor) {
    final NetworkImageView imgNewsItem = (NetworkImageView) view.findViewById(R.id.imgNewsItem); 
    final ProgressBar progressNewsList = (ProgressBar) view.findViewById(R.id.progressNewsList);

    progressNewsList.setVisibility(View.VISIBLE);
    imgNewsItem.setVisibility(View.GONE);
    Ln.d("get news image: %s", cursor.getString(cursor.getColumnIndex(News.IMAGE_COLUMN)));
    ImageCacheManager.getInstance().getImageLoader().get(cursor.getString(cursor.getColumnIndex(News.IMAGE_COLUMN)), new ImageListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            Ln.e(error);
            progressNewsList.setVisibility(View.GONE);
            imgNewsItem.setVisibility(View.VISIBLE);
            imgNewsItem.setImageResource(R.drawable.news_default_image);
        }

        @Override
        public void onResponse(ImageContainer response, boolean isImmediate) {
            progressNewsList.setVisibility(View.GONE);
            imgNewsItem.setVisibility(View.VISIBLE);
            imgNewsItem.setImageBitmap(response.getBitmap());
        }
    });
}

@Override
public View newView(Context arg0, Cursor arg1, ViewGroup parent) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View retView = inflater.inflate(R.layout.row_view, parent, false);
    return retView;
}
}

我已经调试并发现截取下载和缓存图像位图是可以的,但是图像视图没有显示

我的项目布局如下所示:

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="5dp" >

    <com.android.volley.toolbox.NetworkImageView
        android:id="@+id/imgNewsItem"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:scaleType="fitXY"
        android:src="@drawable/news_default_image"
      android:visibility="gone" />

    <ProgressBar
        android:id="@+id/progressNewsList"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" 
        >
    </ProgressBar>
</LinearLayout>

此示例中的ImageCacheManager: 你能告诉我哪里错了吗?。提前谢谢


更新:另外,下载时不会显示进度条。

您需要将ImageListener.onResponse方法更改为以下方法:

@Override
public void onResponse(ImageContainer response, boolean isImmediate) {
    Bitmap bitmap = response.getBitmap();
    if(bitmap != null){
       progressNewsList.setVisibility(View.GONE);
       imgNewsItem.setVisibility(View.VISIBLE);
       imgNewsItem.setImageBitmap(bitmap);
   }
}
以下是ImageListener的java文档:

用于映像请求的响应处理程序的接口。呼叫流 这是:1附加到请求后,onResponse(响应, true)将被调用以反映任何已缓存的数据 可用。如果数据可用,则将返回response.getBitmap() 非空。2.网络响应返回后,只有一个 将发生以下情况:-onResponse(response,false)将 如果图像已加载,则调用。或-如果 加载图像时出错


若您正在使用方法加载图像,并且ProgressBar已在不同的方法中初始化,那个么在onResponse(…)上隐藏ProgressBar可能不起作用,所以您需要将ProgressBar作为参数传递

private void loadImage(String imageUrl, final ImageView imageView, final ProgressBar progressBar) {
    //progressBar.setVisibility(View.VISIBLE);
    if (imageUrl != null) {
        mImageLoader.get(imageUrl, new ImageLoader.ImageListener() {

            @Override
            public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
                if (response.getBitmap() != null) {
                    progressBar.setVisibility(View.GONE);
                    imageView.setImageBitmap(response.getBitmap());
                }
            }

            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("onErrorResponse ", error.toString());
                progressBar.setVisibility(View.GONE);
            }
        });
    }
}

LinearLayout
更改为
FrameLayout
,并将在networkimageview之前取得进展的顺序更改为如下

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="5dp" >

<ProgressBar
        android:id="@+id/progressNewsList"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" 
        >
    </ProgressBar>

    <com.android.volley.toolbox.NetworkImageView
        android:id="@+id/imgNewsItem"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:scaleType="fitXY"
        android:src="@drawable/news_default_image"
      android:visibility="gone" />


</FrameLayout>
迈辛格尔顿班

public class MySingleton {

    private static MySingleton mInstance;
    private Context mContext;
    private RequestQueue mResquestQueue;
    private ImageLoader mImageLoader;

    private MySingleton(Context mCtx){
        this.mContext = mCtx;
        mResquestQueue = Volley.newRequestQueue(MyApplication.getAppContext());
        mImageLoader = new ImageLoader(mResquestQueue , new ImageLoader.ImageCache(){
            private final LruCache<String , Bitmap> cache = new LruCache<>(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 MySingleton getInstance(Context context){
        if(mInstance == null){
            mInstance = new MySingleton(context);
        }
        return mInstance;

    }

    public RequestQueue getResquestQueue(){
        if(mResquestQueue == null){
            mResquestQueue= Volley.newRequestQueue(mContext.getApplicationContext());
        }
        return mResquestQueue;
    }

    public <T> void addToRequestQueue(Request<T> request){
          mResquestQueue.add(request);
    }

    public ImageLoader getmImageLoader(){
        return mImageLoader;
    }

    public void CancelAllRequestes(){
        if(mResquestQueue != null){
            mResquestQueue.cancelAll(this);
        }
    }

}
公共类MySingleton{
私有静态MySingleton-mInstance;
私有上下文;
私有请求队列mResquestQueue;
私有图像加载器;
私人迈辛格尔顿(上下文mCtx){
this.mContext=mCtx;
mResquestQueue=Volley.newRequestQueue(MyApplication.getAppContext());
mImageLoader=newImageLoader(mResquestQueue,newImageLoader.ImageCache(){
专用最终LruCache缓存=新LruCache(20);
@凌驾
公共位图getBitmap(字符串url){
返回cache.get(url);
}
@凌驾
公共位图(字符串url、位图){
cache.put(url、位图);
}
});
}
公共静态同步MySingleton getInstance(上下文){
if(minInstance==null){
MinInstance=新的MySingleton(上下文);
}
回报率;
}
公共请求队列getResquestQueue(){
if(mResquestQueue==null){
mResquestQueue=Volley.newRequestQueue(mContext.getApplicationContext());
}
返回mResquestQueue;
}
公共无效addToRequestQueue(请求){
mResquestQueue.add(请求);
}
公共图像加载器getmImageLoader(){
返回图像加载器;
}
public void CancelAllRequestes(){
if(mResquestQueue!=null){
mResquestQueue.cancelAll(此);
}
}
}

老实说,我看不出你是如何遵循这个例子的?我认为您不应该调用加载程序的
get
。。您是否尝试过:
imgNewsItem.setImageUrl(,ImageCacheManager.getInstance().getImageLoader())但是我需要侦听器隐藏进度条。为什么你要隐藏
ProgressBar
,尽管你必须
disclose()它。@GrIsHu因为我没有显示进度对话框。我只是想在下载图片时有一个带圆形的进度条。你的答案有问题。首先
imageUrl.equals(null)
将抛出NullpointerException如果imageUrl为null,则应使用
imageUrl!=空
。第二,将ProgressBar作为参数传递没有任何意义,这与我的bindView方法相同。第二点,您正在bindview方法中初始化和处理ProgressBar,这样就没有问题了,但是如果您使用的是不同的方法,并且您正在处理已经在bindview中初始化的ProgressBar,那么它将不起作用。
public class MySingleton {

    private static MySingleton mInstance;
    private Context mContext;
    private RequestQueue mResquestQueue;
    private ImageLoader mImageLoader;

    private MySingleton(Context mCtx){
        this.mContext = mCtx;
        mResquestQueue = Volley.newRequestQueue(MyApplication.getAppContext());
        mImageLoader = new ImageLoader(mResquestQueue , new ImageLoader.ImageCache(){
            private final LruCache<String , Bitmap> cache = new LruCache<>(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 MySingleton getInstance(Context context){
        if(mInstance == null){
            mInstance = new MySingleton(context);
        }
        return mInstance;

    }

    public RequestQueue getResquestQueue(){
        if(mResquestQueue == null){
            mResquestQueue= Volley.newRequestQueue(mContext.getApplicationContext());
        }
        return mResquestQueue;
    }

    public <T> void addToRequestQueue(Request<T> request){
          mResquestQueue.add(request);
    }

    public ImageLoader getmImageLoader(){
        return mImageLoader;
    }

    public void CancelAllRequestes(){
        if(mResquestQueue != null){
            mResquestQueue.cancelAll(this);
        }
    }

}