Android中ImageLoader的使用

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;
    }
}
運行結果:







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章