图片加载-如何在android中的ListView实现图片的异步加载?

问题描述

如何在android中的ListView实现图片的异步加载?
想要实现对ListView Item 中图片的加载?各位帮忙怎么实现?

解决方案

我封装了一个异步加载类 开放源码并且提供示例代码

这是地址ImageAsyncLoader

解决方案二:
Java代码

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() {               @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(isrc"");          return d;      }       public interface ImageCallback {           public void imageLoaded(Drawable imageDrawable String imageUrl);       }  

}

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

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;      }  

}

Java代码

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的子元素布局
Java代码

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 {

    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""?>

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""/>  

解决方案三:
AsyncLoader或者AsyncTask都行,你看看apidemos里面的代码,有例子。。。。。。

解决方案四:
没仔细看,但是原来自己也是这么做的。楼主这是一篇提问帖还是一篇技术贴呀?

时间: 2024-10-29 22:30:01

图片加载-如何在android中的ListView实现图片的异步加载?的相关文章

pb9aaaaaaa-如何在pb9中创建window窗口的标题前面加图片

问题描述 如何在pb9中创建window窗口的标题前面加图片 如何在pb9中创建window窗口的标题前面加图片aaaaaaaaaaaaaaaaaaaaaaaaaaa

发帖功能-【新手求助!!】android 中如何实现类似“说说”“帖子”的加载

问题描述 [新手求助!!]android 中如何实现类似"说说""帖子"的加载 最近想做一个发帖的功能,但是不知道 怎么把写好的"帖子" 加载在另一个布局里.求帮助,,有实例最好 或者可以详细讲讲思路 拜谢! 解决方案 你是说想QQ空间发说说那样吗? 是的话 很简单 点击发说说调到说说界面 利用 startActivityForResult(intent, Constants.VOTE); 发了说说成功之后结束说说界面 setResult(Con

Android中屏幕密度和图片大小的关系详解

Android中屏幕密度和图片大小的关系详解 前言 Android中支持许多资源,包括图片(Bitmap),对应于bitmap的文件夹是drawable,除了drawable,还有drawable-ldpi.drawable-mdpi.drawable-hdpi.drawable-xhdpi.drawable-xxhdpi等,同一张图片放到上面不同的文件夹中是有区别的,比如一张100 * 100像素大小的图片,分别放在上述各个文件夹中,然后将其设置为ImageView(假设宽高都是wrap_co

如何在android 中添加行断点?

问题描述 如何在android 中添加行断点? 请问如何在 Android 中动态的添加行断点呢? TableRow tr5 = new TableRow(this); tr5.setLayoutParams(new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); TextView b5 = new TextView(this); b5.setLayoutParams(new LayoutParams(

如何在 android 中动态的添加 checkboxs?

问题描述 如何在 android 中动态的添加 checkboxs? 我想在android中动态的创建edittext 字段,也创建了按钮点击事件.当我点击按钮,check boxes就会显示.但是当我在onclick动作上创建checkbox对象,就显示错误.使用的代码如下,为什么会显示错误呢? public class InflationActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceS

如何在 android 中设置一个用户名和密码文件

问题描述 如何在 android 中设置一个用户名和密码文件 我设置了两个edittext和一个button.我想设置一个特殊的用户名和密码,当我点击按钮时,如果用户名和密码正确,就会打开一个新的intent,否则显示一个toast.我用的下面的代码显示不同的toast,但是没有运行出来,总是显示 ""incorrect"".如何解决这个问题呢? b.setOnClickListener(new OnClickListener() { public void onC

qt gui-如何在qtdesigner中调用并修改图片

问题描述 如何在qtdesigner中调用并修改图片 选择文件路径并展示QAQ求大神指点,用qt designer实现 解决方案 图片先添加到资源里面(工程右键--添加新文件--Qt--Qt Resource File)然后可以用styleSheet来设置,比如: border-image: url(:/new/login/login.png); 解决方案二: 图片修改

如何在 android 中保存key?

问题描述 如何在 android 中保存key? 有什么方法可以在android中保存key呢?这样即使key已经被root,其他人也不能重新取回.不是shared preferences而是要将key放在安卓中非常保密的地方. 主要是要保存服务器发送里的动态key. 如何在 android 中保存key?

如何在Android中捕获cocos的崩溃信息

问题描述 如何在Android中捕获cocos的崩溃信息 需要手机Android项目中的崩溃信息到文件中,然后上传服务器.我现在知道怎么收集Android的崩溃信息到文件中,也知道如何上传服务器.但是我的项目中有cocos的代码,我怎么能收集到cocos的崩溃信息呢? 我看过http://www.cnblogs.com/lancidie/archive/2013/04/13/3019349.html这里面的内容,想试着做出来,但是在把jni部分的代码粘进去以后,出现了很多错误,代码如下: #in