listview加载网络图片

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 XML
	        View 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 ImageView
	        String 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 TextView
	        TextView textView = viewCache.getTextView();
	        textView.setText(imageAndText.getText());

	        return rowView;
	    }

}-------------------------------------------------------------------------------------------------
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() {                 @Override                 public 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);         }

}
时间: 2024-10-25 19:03:11

listview加载网络图片的相关文章

[android]完美解决ListView加载网络图片乱跳问题

为什么 先说一下为什么会出现图片乱跳. 使用convertView对ListView的每个item优化,item的复用可以有效降低内存的占用,使ListView滑动更为流畅.但会带来一个问题,当最顶部的item滑出屏幕时,会变成下一个从底部将要滑进来的item.每次滑进来的item都要去请求网络获得图片. 第一个item滑出去时,是带着图片的.其ImageView指向了一块内存.当其慢慢滑出,从底部慢慢滑进时,底部的item与顶部(只有一半在屏幕里能看到了)的还是指向 同一块内存.加载的了同一张

[android]完美的解决方案ListView加载网络图片反弹问题

为什么 先说为什么有照片反弹. 使用convertView对ListView的每一个item优化,item的复用能够有效减少内存的占用.使ListView滑动更为流畅. 但会带来一个问题,当最顶部的item滑出屏幕时.会变成下一个从底部将要滑进来的item.每次滑进来的item都要去请求网络获得图片. 第一个item滑出去时,是带着图片的. 其ImageView指向了一块内存.当其慢慢滑出,从底部慢慢滑进时,底部的item与顶部(仅仅有一半在屏幕里能看到了)的还是指向 同一块内存.载入的了同一张

(BUG已修改,最优化)安卓ListView异步加载网络图片与缓存软引用图片,线程池,只加载当前屏之说明

原文:http://blog.csdn.net/java_jh/article/details/20068915 迟点出更新的.这个还有BUG.因为软引应不给力了.2.3之后 前几天的原文有一个线程管理与加载源过多,造成浪费流量的问题.下面对这进下改进的一些说明(红色为新加) 这两天一直在优化这个问题.google也很多种做法.但发现都是比较不全面. 比如: 一些只实现了异步加载,却没有线程池与软引用. 一些是用AsynTast的, 一些有了线程池但加载所有的图片,这样造成具大资源浪费 一些是用

Android之ListView异步加载网络图片(优化缓存机制)【转】

网上关于这个方面的文章也不少,基本的思路是线程+缓存来解决.下面提出一些优化: 1.采用线程池 2.内存缓存+文件缓存 3.内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制只能使用最大JVM内存的1/4 4.对下载的图片进行按比例缩放,以减少内存的消耗 具体的代码里面说明.先放上内存缓存类的代码MemoryCache.java: public class MemoryCache { private static final String TAG = "MemoryCa

android ListView使用软引用解决加载网络图片快速滑动卡顿

前段时间做了一个新闻类的项目,新闻列表中的图片都是网络图片,刚开始是自定义ImageView(等于是在其中加了一个异步下载然后设置背景)虽然可以加载网络图片,不过当快速滑动的时候会很卡顿,而且前期没有对Bitmap做回收,导致OOM(内存溢出),后来上网查了各种资料,大概有两种思路: 1.滑动的时候不加载图片,等滑动停止之后再加载,这样就需要对ListView进行OnScrollListener监听,得到屏幕上显示的开始和结束的位置(当有headView和footerView时需要换算)然后下载

Android中用双缓存技术,加载网络图片

最近在学校参加一个比赛,写的一个Android应用,里面要加载大量的网络图片,可是用传统的方法图片一多就会造成程序出现内存溢出而崩溃.因为自己也在学习中,所以看了很多博客和视频,然后参照这些大神的写源码,自己写了一个加载网络图片工具类. 里面要用到一个经典的图片缓存库DiskLruCache 下载地址为:  DiskLruCache下载 下面是使用这个类实现的 双缓存网络图片加载 [java] view plain copy public class DiskLruCacheUtils { pr

Afianl加载网络图片(续)

上一篇已经讲了如何利用Afianl加载网络图片和下载文件,这篇文章将继续讲解使用Afinal加载网络图片的使用,主要结合listview的使用: 看效果图: listview在滑动过程中没用明显卡顿,很流畅,这点优化的很不错,Afianl使用前当然是要先添加jar包啦,接下来看代码: activity_main.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns

Android利用Volley框架加载网络图片

Volley框架是在Google I/O 2013上Volley发布的,目的是使Android平台上的网络通信库,能使网络通信更快,更简单,更健壮.我们也简单了解下Volley引入的背景,在Volley出现以前,我们可能面临如下的问题,比如要在ListView或是GridView中加载数量较多的图片时:先在ListAdapter#getView()里开始图像的读取,再通过AsyncTask等机制使用HttpURLConnection从服务器去的图片资源,然后在AsyncTask#onPostEx

iOS开发swift版异步加载网络图片(带缓存和缺省图片)

iOS开发之swift版异步加载网络图片 与SDWebImage异步加载网络图片的功能相似,只是代码比较简单,功能没有SD的完善与强大,支持缺省添加图片,支持本地缓存. 异步加载图片的核心代码如下:  func setZYHWebImage(url:NSString?, defaultImage:NSString?, isCache:Bool){         var ZYHImage:UIImage?         if url == nil {             return