使用开源imageLoader优化listview加载大量本地图片的demo
package com.example.listviewdemo;import java.util.ArrayList;import java.util.Collections;import java.util.LinkedList;import java.util.List;import android.database.Cursor;import android.graphic
·
package com.example.listviewdemo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;
import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.smalt.smaltmap.utils.GlobalConstant;
/**
*
* @Title:
* @Description:ListView显示大量图片
* @Copyright: Copyright (c) 2014
* @Company:
* @author: Administrator
* @version: 1.0.0.0
* @Date: 2014-2-14
*/
public class MainActivity01 extends AbsListViewBaseActivity {
DisplayImageOptions options; // 配置图片加载及显示选项
ListView lvShow;
/**
* 存储图片地址
*/
ArrayList<String> listImgPath;
String[] imageUriArray;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lvShow = (ListView) findViewById(R.id.lv_show);
// 扫描内存中图片并存入list
listImgPath = getImgPathList();
if (listImgPath.size() < 1) {
GlobalConstant.i("sd卡中无图片");
} else {
// list转成数组
imageUriArray = (String[]) listImgPath
.toArray(new String[listImgPath.size()]);
// 配置图片加载及显示选项(还有一些其他的配置,查阅doc文档吧)
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.ic_launcher) // 在ImageView加载过程中显示图片
.showImageForEmptyUri(R.drawable.ic_launcher) // image连接地址为空时
.showImageOnFail(R.drawable.ic_launcher) // image加载失败
.cacheInMemory(true) // 加载图片时会在内存中加载缓存
.cacheOnDisc(true) // 加载图片时会在磁盘中加载缓存
.displayer(new RoundedBitmapDisplayer(20)) // 设置用户加载图片task(这里是圆角图片显示)
.build();
// 加载适配器
lvShow.setAdapter(new AdapterList());
}
}
@Override
public void onBackPressed() {
AnimateFirstDisplayListener.displayedImages.clear();
super.onBackPressed();
}
/**
*
* 获取图片地址列表
*
* @return list
*/
private ArrayList<String> getImgPathList() {
ArrayList<String> list = new ArrayList<String>();
Cursor cursor = getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[] { "_id", "_data" }, null, null, null);
while (cursor.moveToNext()) {
list.add(cursor.getString(1));// 将图片路径添加到list中
}
cursor.close();
return list;
}
/** 图片加载监听事件 **/
private static class AnimateFirstDisplayListener extends
SimpleImageLoadingListener {
static final List<String> displayedImages = Collections
.synchronizedList(new LinkedList<String>());
@Override
public void onLoadingComplete(String imageUri, View view,
Bitmap loadedImage) {
if (loadedImage != null) {
ImageView imageView = (ImageView) view;
boolean firstDisplay = !displayedImages.contains(imageUri);
if (firstDisplay) {
FadeInBitmapDisplayer.animate(imageView, 500); // 设置image隐藏动画500ms
displayedImages.add(imageUri); // 将图片uri添加到集合中
}
}
}
}
/**
*
* @Title:
* @Description:listview适配器
* @Copyright: Copyright (c) 2014
* @Company:
* @author: Administrator
* @version: 1.0.0.0
* @Date: 2014-2-14
*/
class AdapterList extends BaseAdapter {
private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();
@Override
public int getCount() {
// TODO Auto-generated method stub
return imageUriArray.length;
}
/**
* 构造方法
*/
public AdapterList() {
// TODO Auto-generated constructor stub
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
/*
* (non-Javadoc)
*
* @see android.widget.Adapter#getItemId(int)
*/
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
/*
* (non-Javadoc)
*
* @see android.widget.Adapter#getView(int, android.view.View,
* android.view.ViewGroup)
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
// 初始化绑定控件
convertView = getLayoutInflater().inflate(R.layout.layout_item, null);
holder.imgShow = (ImageView) findViewById(R.id.img_show);
holder.tvShow = (TextView) findViewById(R.id.tv_show);
// add to convertView
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// 设置img,text具体显示的内容
holder.tvShow.setText("fuck" + (position));
imageLoader.displayImage(imageUriArray[position], holder.imgShow,
options, animateFirstListener);
return convertView;
}
}
static class ViewHolder {
ImageView imgShow;
TextView tvShow;
}
}
demo下载:
https://drive.google.com/file/d/0B3vXJifsRl4bTk8wUFpyNk9lNEU/edit?usp=sharing
更多推荐
已为社区贡献8条内容
所有评论(0)