Android中ImageLoader的使用

本文介绍如何使用Volley库将多个网络图片加载到Android的ListView中,并通过单例设计模式和适配器实现图片展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ImageLoader是用来加载多个网络图片的,这次我们实现的是把网络图片加载到ListView中。

首先我们把Volley.jar包添加到Android Studio中的libs目录中,然后刷新一下。

activity_main中只有一个ListView

一、MainActivity:

package com.example.administrator.imageloader;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;

import com.example.administrator.imageloader.adapter.ImageAdapter;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ListView lv;
    private List<String>urls;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    private void init() {
        lv = (ListView) findViewById(R.id.lv);
        urls = new ArrayList<>();
        initList();
        ImageAdapter adapter = new ImageAdapter(urls,this);
        lv.setAdapter(adapter);
    }

    private void initList() {
        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");
        urls.add("http://img2.imgtn.bdimg.com/it/u=1942812496,2337888220&fm=21&gp=0.jpg");
        urls.add("http://img5.imgtn.bdimg.com/it/u=1755111051,4257519768&fm=21&gp=0.jpg");
        urls.add("http://img5.imgtn.bdimg.com/it/u=921123054,1714480967&fm=21&gp=0.jpg");
        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");
        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");
        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");
        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");
        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");
        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");
        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");
        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");
        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");
        urls.add("http://img0.imgtn.bdimg.com/it/u=4087866388,590061000&fm=21&gp=0.jpg");
    }
}
二、单例设计模式的类:

package com.example.administrator.imageloader;

import android.content.Context;
import android.graphics.Bitmap;
import android.util.LruCache;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;

/**
 * 单例设计模式
 * Created by 匡效国 on 15-11-3.
 */
public class NetworkSingleTon {
    private static ImageLoader imageLoader;
    private static RequestQueue requestQueue;
    private Context context;
    private static NetworkSingleTon singleInstance;

    //公有的创造方法
    public static NetworkSingleTon createNetworkSingleTon(Context context) {
        if (singleInstance == null) {
            singleInstance = new NetworkSingleTon(context);
        }
        return singleInstance;
    }

    private NetworkSingleTon(Context context) {
        //在私有的构造函数中实例化requestQueue和imageLoader
        requestQueue = Volley.newRequestQueue(context);
        imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {
            int maxSize = (int) (Runtime.getRuntime().maxMemory() / 8);

            private LruCache<String, Bitmap> lruCache = new LruCache<String, Bitmap>(maxSize) {
                @Override
                protected int sizeOf(String key, Bitmap value) {
                    int ret = value.getRowBytes() * value.getHeight();
                    return ret;
                }
            };

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

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

    public static RequestQueue getRequestQueue() {
        return requestQueue;
    }

    public static ImageLoader getImageLoader() {
        return imageLoader;
    }
}
三、创建一个Application的子类,实例化单例模式类:

package com.example.administrator.imageloader;

import android.app.Application;

/**
 * Created by Administrator on 15-11-3.
 */
public class MyApplication extends Application {


    @Override
    public void onCreate() {
        super.onCreate();
        //getApplicationContext()获取Application的上下文
        //将NetworkSingleTon实例化
        NetworkSingleTon.createNetworkSingleTon(getApplicationContext());
    }
}
四、在清单文件中声明:

<application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
五、创建适配器:

package com.example.administrator.imageloader.adapter;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;

import com.android.volley.RequestQueue;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.example.administrator.imageloader.NetworkSingleTon;

import java.util.List;

/**
 * Created by Administrator on 15-11-3.
 */
public class ImageAdapter extends BaseAdapter {

    private List<String> list;
    private Context context;
    private ImageLoader imageLoader;
    private RequestQueue requestQueue;

    public ImageAdapter(List<String> list, final Context context) {
        this.list = list;
        this.context = context;
        //调用NetworkSingleTon类的静态方法得到requestQueue和imageLoader
        requestQueue = NetworkSingleTon.getRequestQueue();
        imageLoader = NetworkSingleTon.getImageLoader();
    }

    @Override
    public int getCount() {

        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView = null;
        if (convertView != null) {
            imageView = (ImageView) convertView;
        } else {
            imageView = new ImageView(context);
        }
        String url = list.get(position);
        final ImageView finalImageView = imageView;
        //获取回调函数中返回的Bitmap并设置给ImageView
        imageLoader.get(url, new ImageLoader.ImageListener() {
            @Override
            public void onResponse(ImageLoader.ImageContainer imageContainer, boolean b) {
                finalImageView.setImageBitmap(imageContainer.getBitmap());
            }

            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        });
        return finalImageView;
    }
}
运行结果:







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值