转: http://www.iteye.com/topic/685986

ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴上主方法的代码:

package cn.wangmeng.test;import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;public class AsyncImageLoader {private HashMap<String, SoftReference<Drawable>> imageCache;public AsyncImageLoader() {imageCache = new HashMap<String, SoftReference<Drawable>>();}public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) {if (imageCache.containsKey(imageUrl)) {SoftReference<Drawable> softReference = imageCache.get(imageUrl);Drawable drawable = softReference.get();if (drawable != null) {return drawable;}}final Handler handler = new Handler() {public void handleMessage(Message message) {imageCallback.imageLoaded((Drawable) message.obj, imageUrl);}};new Thread() {@Overridepublic void run() {Drawable drawable = loadImageFromUrl(imageUrl);imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));Message message = handler.obtainMessage(0, drawable);handler.sendMessage(message);}}.start();return null;}public static Drawable loadImageFromUrl(String url) {URL m;InputStream i = null;try {m = new URL(url);i = (InputStream) m.getContent();} catch (MalformedURLException e1) {e1.printStackTrace();} catch (IOException e) {e.printStackTrace();}Drawable d = Drawable.createFromStream(i, "src");return d;}public interface ImageCallback {public void imageLoaded(Drawable imageDrawable, String imageUrl);}}

以上代码是实现异步获取图片的主方法,SoftReference是软引用,是为了更好的为了系统回收变量,重复的URL直接返回已有的资源,实现回调函数,让数据成功后,更新到UI线程。 
几个辅助类文件:

package cn.wangmeng.test;public class ImageAndText {private String imageUrl;private String text;public ImageAndText(String imageUrl, String text) {this.imageUrl = imageUrl;this.text = text;}public String getImageUrl() {return imageUrl;}public String getText() {return text;}
}

package cn.wangmeng.test;import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;public class ViewCache {private View baseView;private TextView textView;private ImageView imageView;public ViewCache(View baseView) {this.baseView = baseView;}public TextView getTextView() {if (textView == null) {textView = (TextView) baseView.findViewById(R.id.text);}return textView;}public ImageView getImageView() {if (imageView == null) {imageView = (ImageView) baseView.findViewById(R.id.image);}return imageView;}}

ViewCache是辅助获取adapter的子元素布局

package cn.wangmeng.test;import java.util.List;import cn.wangmeng.test.AsyncImageLoader.ImageCallback;import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;public class ImageAndTextListAdapter extends ArrayAdapter<ImageAndText> {private ListView listView;private AsyncImageLoader asyncImageLoader;public ImageAndTextListAdapter(Activity activity, List<ImageAndText> imageAndTexts, ListView listView) {super(activity, 0, imageAndTexts);this.listView = listView;asyncImageLoader = new AsyncImageLoader();}public View getView(int position, View convertView, ViewGroup parent) {Activity activity = (Activity) getContext();// Inflate the views from XMLView rowView = convertView;ViewCache viewCache;if (rowView == null) {LayoutInflater inflater = activity.getLayoutInflater();rowView = inflater.inflate(R.layout.image_and_text_row, null);viewCache = new ViewCache(rowView);rowView.setTag(viewCache);} else {viewCache = (ViewCache) rowView.getTag();}ImageAndText imageAndText = getItem(position);// Load the image and set it on the ImageViewString imageUrl = imageAndText.getImageUrl();ImageView imageView = viewCache.getImageView();imageView.setTag(imageUrl);Drawable cachedImage = asyncImageLoader.loadDrawable(imageUrl, new ImageCallback() {public void imageLoaded(Drawable imageDrawable, String imageUrl) {ImageView imageViewByTag = (ImageView) listView.findViewWithTag(imageUrl);if (imageViewByTag != null) {imageViewByTag.setImageDrawable(imageDrawable);}}});if (cachedImage == null) {imageView.setImageResource(R.drawable.default_image);}else{imageView.setImageDrawable(cachedImage);}// Set the text on the TextViewTextView textView = viewCache.getTextView();textView.setText(imageAndText.getText());return rowView;}}

ImageAndTextListAdapter是实现ListView的Adapter,里面有个技巧就是imageView.setTag(imageUrl),setTag是存储数据的,这样是为了保证在回调函数时,listview去更新自己对应item,大家仔细阅读就知道了。 
最后贴出布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="wrap_content"><ImageView android:id="@+id/image"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextView android:id="@+id/text"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>

文档下载地址 http://dl.iteye.com/topics/download/57e58e4c-5c76-362a-a903-84ea37f6d530

转载于:https://www.cnblogs.com/622698abc/p/3254175.html

Android实现ListView异步加载图片相关推荐

  1. Android实现ListView异步加载图片总结

    参考自http://blog.csdn.net/wanglong0537/article/details/6334005# http://www.cnblogs.com/slider/archive/ ...

  2. Android之ListView异步加载图片且仅显示可见子项中的图片

    折腾了好多天,遇到 N 多让人崩溃无语的问题,不过今天终于有些收获了,这是实验的第一版,有些混乱,下一步进行改造细分,先把代码记录在这儿吧. 网上查了很多资料,发现都千篇一律,抄来抄去,很多细节和完整 ...

  3. android开发小技巧:实现listview异步加载图片

    2019独角兽企业重金招聘Python工程师标准>>> 针对listview异步加载图片这个问题,麦子学院android开发老师讲了一种非常实用的方法,麦子学院android开发老师 ...

  4. Android ListView异步加载图片乱序问题,原因分析及解决方案

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/45586553 在Android所有系统自带的控件当中,ListView这个控件算是 ...

  5. 又优化了一下 Android ListView 异步加载图片

    写这篇文章并不是教大家怎么样用listview异步加载图片,因为这样的文章在网上已经有很多了,比如这位仁兄写的就很好: http://www.iteye.com/topic/685986 我也是因为看 ...

  6. Android ListView 异步加载图片

    使用ListView.GridView来展示图片是项目中经常遇到的情况,这里使用官方文档的BitmapFun稍作修改实现ListView 异步加载图片效果. 实现原理:给ListView 注册一个 滚 ...

  7. Android开发之ListView异步加载图片

    ListView这个控件对于大家肯定不会陌生,即使你是初学者相信也会用ListView.因为ListView这个控件实在是太常用,可以说基本上每一个项目开发都会用到它,今天这篇博客主要讲解,ListV ...

  8. android listview 异步加载图片并防止错位

    网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertVie ...

  9. ListView异步加载图片,完美实现图文混排

    昨天参加一个面试,面试官让当场写一个类似于新闻列表的页面,文本数据和图片都从网络上获取,想起我还没写过ListView异步加载图片并实现图文混排效果的文章,so,今天就来写一下,介绍一下经验. Lis ...

最新文章

  1. 美多商城之用户中心(添加和验证邮箱)
  2. 回调函数方法连续采集和发送软触发采集
  3. leetcode算法题--圆圈中最后剩下的数字
  4. vue-cli 自定义指令directive 添加验证滑块
  5. 一步步教你在以太坊发行自己的数字货币
  6. @Transactional事务的使用和注意事项及其属性
  7. 阿里巴巴向全社会开放黑科技:“泡在水里”的服务器
  8. 对SPA(单页面应用)的总结
  9. 【转】二维异形件排版算法介绍(二)
  10. asp.net学习之再论sqlDataSource
  11. jQuery分析(3) - jQuery.fn.init
  12. iapp退出软件按钮代码_还在为金蝶财务软件发愁吗?超详细!金蝶财务软件实操流程,速收...
  13. 阿里云 银行卡 信息 四要素 验证
  14. ISA防火墙规则练习
  15. 业务架构实践:一步一步画出业务架构图
  16. 高通骁龙845与骁龙710处理器参数对比分析
  17. 华为服务器新版bios修改IPMI,华为服务器ipmi设置
  18. 安装apk时提示安装失败,相同包名但是签名不一致
  19. three.js和D3.js
  20. 美国军方又出黑科技,实现用意念控制无人机

热门文章

  1. 使用ADO.NET直接连接Geodatabase
  2. 配置Linux声卡,让Arch高歌
  3. mysql 与 oracle 的连表update
  4. Realm数据库拾遗
  5. MyBatis+Spring整合
  6. JVM 垃圾回收器工作原理及使用实例介绍
  7. Exchange 2010 OAB无法更新
  8. SQL SERVER2008 镜像
  9. ORA-03135 ,ORA-02050到底什么原因?
  10. Embarcadero公司花2千3百万买下Borland的开发工具业务