`
clf_dragon
  • 浏览: 3188 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Android实现异步加载图片 ListView(转)

阅读更多
引用
http://blog.jteam.nl/2009/09/17/exploring-the-world-of-android-part-2

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

package com.dragon.example;  
  
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() {  
                 @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);  
         }  
  
}  

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

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 com.dragon.example;    

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 com.dragon.example; 

import java.util.List;  
  
import com.dragon.example.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 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;  
        }  
  
}  

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


分享到:
评论

相关推荐

    转载:Android实现异步加载图片 ListView

    这篇博客“Android实现异步加载图片 ListView”提供了一个解决此类问题的方案。以下是关于这个主题的详细知识点: 1. **ListView**: ListView是Android中的一个视图组件,用于展示多行可滚动的数据列表。它可以高效...

    Android实现ListView异步加载图片

    "Android实现ListView异步加载图片" Android 实现 ListView 异步加载图片是一种常见的技术,旨在提高应用程序的性能和用户体验。本文将详细介绍 Android 中实现 ListView 异步加载图片的方法,并对相关的技术概念...

    Android图片异步加载-ListView、GridView、ViewPager

    总的来说,Android-Universal-Image-Loader为Android开发者提供了一种高效、灵活的图片异步加载解决方案,无论是ListView、GridView还是ViewPager,都可以通过其强大的功能提升用户体验。在实际开发中,掌握这个库的...

    android listView 异步加载图片

    这里的“android listView 异步加载图片”指的是在不阻塞UI线程的情况下,从网络、本地存储或其他来源加载图片到ListView中的技术。 这篇名为“ImageLoader”的Java文件很可能就是一个实现图片异步加载的工具类。在...

    Android Listview异步加载图片

    在Android中,我们可以使用AsyncTask、Handler、Thread、Runnable或者第三方库如Picasso、Glide等来实现异步加载。 1. **AsyncTask**:AsyncTask是一个轻量级的异步任务框架,适合处理短时间的后台任务。我们可以在...

    Android ListView异步加载图片

    Android 异步加载图片,对ListView的异步加载图片的功能演示,主要根据url读取图片返回流的方法。为了方便演示,将请求图片的链接先固定,每读取好一个图片就更新,界面比较简单,当然你可以做成比较好的,像很多好...

    图片异步加载,照片墙,异步加载listview图片2

    以下是对"图片异步加载,照片墙,异步加载listview图片2"这一主题的详细解释。 1. 图片异步加载的重要性: 在移动设备上,如果图片资源直接在主线程中加载,可能会导致应用卡顿或ANR(Application Not Responding...

    android listView图片异步加载(拖动时不加载,双缓存)

    本文将详细介绍如何在ListView中实现图片的异步加载,并且在用户拖动时不加载,以提高滚动流畅性。 一、异步加载原理 异步加载是指在后台线程中执行耗时操作,例如网络请求或解码图片,避免阻塞主线程。Android提供...

    Android 演示异步加载图片的实现 附源代码.rar

    Android 演示异步加载图片的实现 附源代码,这里主要是演示ListView的异步加载图片功能,异步加载一个view时,如果view里面有EditText,EditText在每次加载view都会触发焦点,这时候异步就会出错。可能我这样说不太...

    android异步加载网络图片到ListView

    总结来说,实现"android异步加载网络图片到ListView"涉及到以下几个关键步骤: 1. 使用AsyncTask或其他异步处理方式在后台线程加载网络图片。 2. 应用ViewHolder模式优化ListView的滚动性能。 3. 自定义Adapter,...

    android listview异步加载图片实例(线程池+数据库+本地保存)

    本实例将详细讲解如何实现“Android ListView异步加载图片”,结合线程池、数据库和本地保存来优化性能。 首先,我们需要理解异步加载的概念。在Android中,由于主线程负责用户界面的更新,因此不应在主线程中执行...

    Android中ListView全面完美的网络图片的异步加载

    综上所述,实现Android中ListView全面完美的网络图片异步加载需要结合异步加载库(如Picasso或Glide)、LruCache缓存策略以及动态加载技术。这些方法的运用可以显著提升应用性能,为用户提供流畅的滚动体验,同时...

    Android studio异步数据加载ListView+Adapter+AsyncTask

    总结,通过结合ListView、Adapter和AsyncTask,我们可以实现在Android Studio中异步加载数据,提高应用的响应速度和用户体验。在实际开发中,还需要根据项目的具体需求,灵活运用这些技术和库,不断优化数据加载的...

    Android实现异步加载图片

    首先,Android异步加载图片的目标是将耗时的网络请求或本地文件读取操作放在后台线程,以防止阻塞主线程。Android提供了一些工具和库来帮助开发者实现这一目标,如AsyncTask、Handler、Loader等。在这个例子中,我们...

    ListView异步加载图片

    通过以上步骤,我们可以实现一个高效的ListView图片异步加载机制。这种方案不仅可以提升用户体验,还能有效利用系统资源,避免内存问题。在实际项目中,还可以结合其他图片加载库,如Glide、Picasso等,它们提供了更...

    使用Android Studio 练习RecyclerView 异步加载图片,解决图片乱序问题。

    然而,在实际开发中,当我们需要在RecyclerView中异步加载图片时,可能会遇到图片显示乱序的问题。本文将深入探讨这个问题及其解决方案。 首先,我们来理解为什么会出现图片乱序的现象。这是因为RecyclerView在滚动...

    Android ListView优化 异步加载图片

    你可以通过分析这些代码,更好地理解ListView异步加载图片的实现过程。 通过以上介绍,你应该对Android ListView的优化有了更深入的理解,特别是异步加载图片和Json解析这两个关键环节。实践中,结合各种优化策略,...

Global site tag (gtag.js) - Google Analytics