Android截取-加载图像时在listview适配器中显示进度条
我试图通过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
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);
}
}
}