简单的ListView中item图片异步加载
前言:

public class MainActivity extends Activity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initView() {
listView = (ListView) findView(R.id.listView);
}
private void initData() {
List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
HashMap<String, Object> map1 = new HashMap<String, Object>();
map1.put("img",
"http://img5.imgtn.bdimg.com/it/u=747474479,3247936386&fm=21&gp=0.jpg");
map1.put("txt", "条目一");
HashMap<String, Object> map2 = new HashMap<String, Object>();
map2.put("img",
"http://pic.nipic.com/2007-12-22/2007122215556437_2.jpg");
map2.put("txt", "条目二");
HashMap<String, Object> map3 = new HashMap<String, Object>();
map3.put("img",
"http://img1.imgtn.bdimg.com/it/u=1774561363,2410491846&fm=21&gp=0.jpg");
map3.put("txt", "条目三");
HashMap<String, Object> map4 = new HashMap<String, Object>();
map4.put("img",
"http://img5.imgtn.bdimg.com/it/u=112049007,3368205326&fm=21&gp=0.jpg");
map4.put("txt", "条目四");
HashMap<String, Object> map5 = new HashMap<String, Object>();
map5.put("img",
"http://img3.imgtn.bdimg.com/it/u=2953608063,4260501712&fm=21&gp=0.jpg");
map5.put("txt", "条目五");
list.add(map1);
list.add(map2);
list.add(map3);
list.add(map4);
list.add(map5);
AsyncImageLoadAdapter adapter = new AsyncImageLoadAdapter(
MainActivity.this, list, listView);
listView.setAdapter(adapter);
}
private <T> T findView(int id) {
return (T) findViewById(id);
}
}
public class AsyncImageLoadAdapter extends BaseAdapter {
private Context context;
private List<HashMap<String, Object>> listData;
private AsyncLoad asyncLoad;
private ListView listView;
public AsyncImageLoadAdapter(Context context1,
List<HashMap<String, Object>> listData1, ListView listView1) {
this.context = context1;
this.listData = listData1;
this.asyncLoad = AsyncLoad.instance();
this.listView = listView1;
}
@Override
public int getCount() {
return listData.size();
}
@Override
public Object getItem(int position) {
return listData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(
R.layout.list_item, null);
}
convertView.setTag(position);
ImageView imageView = (ImageView) convertView
.findViewById(R.id.list_item_img);
imageView.setBackgroundResource(R.drawable.img_black);
TextView textView = (TextView) convertView
.findViewById(R.id.list_item_tv);
textView.setText("我是条目" + position);
HashMap<String, Object> item = listData.get(position);
String imageStr = (String) item.get("img");
asyncLoad.loadImage(position, imageStr, new ILoadListener() {
@SuppressLint("NewApi")
@Override
public void onSuccess(Integer pos, Drawable drawable) {
View view = listView.findViewWithTag(pos);
if (view != null) {
ImageView img = (ImageView) view
.findViewById(R.id.list_item_img);
img.setBackground(drawable);
}
}
@Override
public void onFail(String failStr) {
Toast.makeText(context, "错误信息是->" + failStr, Toast.LENGTH_SHORT)
.show();
}
});
return convertView;
}
}
这个Adapter中加载了一个list_item布局(adapter中未用ViewHolder,不要去纠结这个,加上也可),来初始化未加载图片的时候。主要要说的是这段代码
asyncLoad.loadImage(position, imageStr, new ILoadListener() {
@SuppressLint("NewApi")
@Override
public void onSuccess(Integer pos, Drawable drawable) {
View view = listView.findViewWithTag(pos);
if (view != null) {
ImageView img = (ImageView) view
.findViewById(R.id.list_item_img);
img.setBackground(drawable);
}
}
@Override
public void onFail(String failStr) {
Toast.makeText(context, "错误信息是->" + failStr, Toast.LENGTH_SHORT)
.show();
}
});
public class AsyncLoad {
private static AsyncLoad asyncLoad;
/**
* 图片缓存容器,采用软引用,当用户手机内存不够时候,系统自动回收其所占有的内存
*/
private HashMap<String, SoftReference<Drawable>> dataMap;
/**
* 用于在UI线程中进行UI更新
*/
private Handler handler = new Handler();
public synchronized static AsyncLoad instance() {
if (asyncLoad == null)
asyncLoad = new AsyncLoad();
return asyncLoad;
}
public AsyncLoad() {
dataMap = new HashMap<String, SoftReference<Drawable>>();
}
// 内部接口对图片获取的监听
interface ILoadListener {
/**
* 图片加载成功后
*
* @param pos
* 对listView中pos位置
* @param drawable
* 网络加载后获取到的图片
*/
public void onSuccess(Integer pos, Drawable drawable);
public void onFail(String failStr);
}
/**
* 开启线程对图片进行加载
*
* @param pos
* listView的pos位置进行加载
* @param imageStr
* 图片地址
* @param listener
* 监听接口
*/
public void loadImage(final Integer pos, final String imageStr,
final ILoadListener listener) {
// 开启一个线程获取图片资源
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
load(pos, imageStr, listener);
}
}).start();
}
private void load(final Integer pos, final String imageStr,
final ILoadListener listener) {
if (dataMap.containsKey(imageStr)) {
SoftReference<Drawable> softReference = dataMap.get(imageStr);
final Drawable d = softReference.get();
if (d != null) {
handler.post(new Runnable() {
@Override
public void run() {
listener.onSuccess(pos, d);
}
});
}
return;
}
try {
final Drawable d = loadImgFromUrl(imageStr);
if (d != null) {
SoftReference<Drawable> soft = new SoftReference<Drawable>(d);
dataMap.put(imageStr, soft);
}
handler.post(new Runnable() {
@Override
public void run() {
listener.onSuccess(pos, d);
}
});
} catch (final IOException e) {
e.printStackTrace();
// 进行错误信息回报
handler.post(new Runnable() {
@Override
public void run() {
listener.onFail(e.getMessage());
}
});
}
}
/**
* 获取网路图片资源
*
* @param url
* @return
* @throws IOException
*/
private static Drawable loadImgFromUrl(String urlStr) throws IOException {
System.out.println("urlStr->" + urlStr);
URL url;
InputStream i = null;
url = new URL(urlStr);
i = (InputStream) url.getContent();
Drawable drawable = Drawable.createFromStream(i, "img");
return drawable;
}
}
简单的ListView中item图片异步加载的更多相关文章
- Android新浪微博客户端(七)——ListView中的图片异步加载、缓存
原文出自:方杰|http://fangjie.info/?p=193转载请注明出处 最终效果演示:http://fangjie.sinaapp.com/?page_id=54 该项目代码已经放到git ...
- Android ListView 图片异步加载和图片内存缓存
开发Android应用经常需要处理图片的加载问题.因为图片一般都是存放在服务器端,需要联网去加载,而这又是一个比较耗时的过程,所以Android中都是通过开启一个异步线程去加载.为了增加用户体验,给用 ...
- Android图片异步加载框架Android-Universal-Image-Loader
版权声明:本文为博主原创文章,未经博主允许不得转载. Android-Universal-Image-Loader是一个图片异步加载,缓存和显示的框架.这个框架已经被很多开发者所使用,是最常用的几个 ...
- Android图片异步加载之Android-Universal-Image-Loader
将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就 ...
- Android图片异步加载之Android-Universal-Image-Loader(转)
今天要介绍的是Github上一个使用非常广泛的图片异步加载库Android-Universal-Image-Loader,该项目的功能十分强大,可以说是我见过的目前功能最全.性能最优的图片异步加载解决 ...
- [置顶] Android图片异步加载之Android-Universal-Image-Loader
将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就 ...
- Android图片异步加载
原:http://www.cnblogs.com/angeldevil/archive/2012/09/16/2687174.html 相关:https://github.com/nostra13/A ...
- Android-Universal-Image-Loader 图片异步加载类库的使用
在博客中看到一篇利用组件进行图片异步加载的文章在此作记录 原文:http://blog.csdn.net/vipzjyno1/article/details/23206387 这个图片异步加载并缓存的 ...
- Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影. 可是有的人并不知道如何去使用这库如何进行配置,网上查到的信息对于刚 ...
随机推荐
- Train-Alypay-Cloud:分布式微服务中间件sofa 开发培训(第二次)
ylbtech-Train-Alypay-Cloud:分布式微服务中间件sofa 开发培训(第二次) 1.返回顶部 1. 这是本次培训的内容,望各位提前配好环境.工具.2.6-2.7 我们在环球金融8 ...
- [Winform][C#]获取系统颜色预定义颜色和现有字体集
转自: http://zhidao.baidu.com/link?url=ozY7tJRNBYHUsImE6jn1psqc8owib7MWcDMEmZw48q8iD9Hz9MWgnQQcBDO0VYO ...
- python打造漏洞补丁缺少检测
前言: 当我们进行后渗透的时候,进行提权的时候 要识别被未打补丁的漏洞.来进行提权,从而 拿到管理员权限. 思路: 1.让使用者在cmd中打systeminfo命令.将补丁号 放入一个txt. 2.与 ...
- xsigo systems
继虚拟化管理软件巨头VMware以12.6亿美元收购云计算网络虚拟化厂商Nicira后,昨日,有报道称,甲骨文也不甘示弱,宣布收购了另一家网络虚拟化技术厂商Xsigo,为这股SDN(软件定义网络)热潮 ...
- Django的学习之路
Django基础 Django框架基础 http协议及web框架 Django-2的路由层(URLconf) Django的视图层 Django框架之第三篇模板语法(重要!!!) Django框架之模 ...
- Java中权限设置
package think_in_java_access_contorl; import think_in_java_access_contorl.access.Cookie; /** * 1.在Ja ...
- php使用curl库进行ssl双向认证
官方文档: http://www.php.net/manual/zh/function.curl-setopt.php#10692 官方举例: <?phpcurl_setopt($ch, CUR ...
- ICaptureGraphBuilder2::RenderStream 智能连接方法浅析
ICaptureGraphBuilder2::RenderStream HRESULT RenderStream( [in] const GUID *pCategory, [in] const GUI ...
- VMware 克隆网卡无法启动
问题描述: 最近学习 hadoop,环境准备搭建在虚拟机之上,装好一台虚拟机克隆完成后,网卡无法启动. 多年前,初学 Linux 的时候,就遇到过这个问题,记录的笔记找不到了,简单记录一下. shel ...
- Api2Doc生成 Restful API 文档
1,引入maven <dependency> <groupId>com.github.terran4j</groupId> <artifactId>te ...