大家好,最近在问答专区上看到了很多朋友问如何加载网络图片或者加载网络图片失败的问题,因为之前没有整理过类似的文章,但是也不能把别人的文章地址复制过来吧,这也是对自己的不尊重是吧,hiahia~,所以决定立即写一篇博客,介绍一下Universal-ImageLoader这个强大的工具的用法,虽然不是很详细,但是我自己写了个小demo,代码比较详细,大家也看的明白,如果有不懂的可以继续发私信我,我会一一为大家解答问题,我们的目的是共同进步嘛,好啦,废话不多说,下面我来给大家写个例子。
1)首先,我们导入Universal-Image-Loader.jar包,然后右键BuildPath,将jar包添加到工程目录下,然后我们的ImageLoader还需要写一个类AppContext继承自Application,里面的代码主要是用来配置ImageLoader的初始化的,涉及到一些配置参数之类的,大家可以看看代码,具体如下所示:
package com.example.listviewimageloaderdemo;
import android.app.Application;
import android.content.Context;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
public class AppContext extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = this;
initImageLoader();
}
public static Context getAppContext() {
return context;
}
private final static void initImageLoader() {
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context).defaultDisplayImageOptions(getDefaultDisplayOption())
.threadPriority(Thread.NORM_PRIORITY - 2).denyCacheImageMultipleSizesInMemory()
.imageDownloader(new BaseImageDownloader(context))
.tasksProcessingOrder(QueueProcessingType.LIFO).build();
ImageLoader.getInstance().init(config);
}
private final static DisplayImageOptions getDefaultDisplayOption() {
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.drawable.empty_photo) // 设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.drawable.empty_photo) // 设置图片加载或解码过程中发生错误显示的图片
.cacheInMemory(true) // 设置下载的图片是否缓存在内存中
.cacheOnDisk(true) // 设置下载的图片是否缓存在SD卡中
.showImageOnLoading(R.drawable.empty_photo).build(); // 创建配置过得DisplayImageOption对象
return options;
}
}
2)然后我们再为listview的布局写一个item.xml文件,里面只放置一个ImageView对象,简单用来显示加载网络的图片,具体代码如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#ffffff"
android:orientation="vertical" >
<ImageView
android:id="@+id/imageview"
android:layout_margin="10dp"
android:layout_width="match_parent"
android:layout_height="160dp"
android:scaleType="centerCrop"
android:src="@drawable/empty_photo" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#50000000"/>
</LinearLayout>
3)现在我们在主页布局activity_main.xml文件中添加一个ListView对象,具体代码如下所示:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</RelativeLayout>
4)第四步,我们在MainActivity中编写代码,代码包括几部分内容,第一是我们的网络图片网址数据,我在网上找了几张马苏妹子的横版写真,样式比较符合我们横向展示的需求,所以这里就以她为例,其次我们需要编写一个BaseAdapter,这里我并没有写一个MyAdapter类继承BaseAdapter,只是用了匿名内部类的方法直接实现了,因为我们的需求比较的简单嘛,大家见谅,最后就是为listview对象赋值啦,好啦,具体代码如下所示,如果有不懂的可以在底下留言,看到了我就会回复大家:
package com.example.listviewimageloaderdemo;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import com.nostra13.universalimageloader.core.ImageLoader;
public class MainActivity extends Activity {
private List<String> imgUrls = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
imgUrls.add("http://t12.baidu.com/it/u=2627729012,2757221180&fm=32&s=6FF03AD45F22531708D914660300A074&w=800&h=533&img.JPEG");
imgUrls.add("http://t10.baidu.com/it/u=2822595750,3054012252&fm=32&s=6ED02AD44B2056171A9D566403007074&w=800&h=533&img.JPEG");
imgUrls.add("http://t10.baidu.com/it/u=2696906466,2879118173&fm=32&s=6ED03AD64F2057175A59566E0300E074&w=800&h=533&img.JPEG");
imgUrls.add("http://t11.baidu.com/it/u=2883034624,3005607117&fm=32&s=29802EDD4E01775D6069975F0300D075&w=800&h=533&img.JPEG");
imgUrls.add("http://t10.baidu.com/it/u=2830754568,2918379817&fm=32&s=6BF01BD45F404651485C574E0300F074&w=800&h=533&img.JPEG");
imgUrls.add("http://t10.baidu.com/it/u=2345084643,2692649554&fm=32&s=88B86A964F22521502D1DE700300F07F&w=800&h=533&img.JPEG");
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = getLayoutInflater().inflate(R.layout.item,
null);
holder.imageView = (ImageView) convertView
.findViewById(R.id.imageview);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
ImageLoader.getInstance().displayImage(imgUrls.get(position),
holder.imageView);
return convertView;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public Object getItem(int position) {
return imgUrls.get(position);
}
@Override
public int getCount() {
return imgUrls.size();
}
});
}
class ViewHolder {
ImageView imageView;
}
}
5)最后千万不要忘了一点,就是在清单文件Mainfest.xml文件中添加联网权限,要不然是无法加载图片的哦
<uses-permission android:name="android.permission.INTERNET"/>
还有一点就是此时要将Application设置成我们自己实现的AppContext对象,只用在清单文件中添加一个name属性,选择我们的AppContext即可
<application
android:name="com.example.listviewimageloaderdemo.AppContext"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
好了,到这里我们可以部署到模拟器或者手机上观察效果了,可以发现此时用ImageLoader加载的网络图片完美的展示在了listview的item对象上,是不是很神奇呀~好啦,这里就是简单介绍了如何使用ImageLoader加载网络图片,以及如何赋值到ListView对象上,代码比较简单,但是希望对一些初学者有一定的帮助那就可以啦~再见~