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