`
weizhai12
  • 浏览: 149356 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Android实现ListView异步加载图片

 
阅读更多

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

  1. packagecn.wangmeng.test;
  2. importjava.io.IOException;
  3. importjava.io.InputStream;
  4. importjava.lang.ref.SoftReference;
  5. importjava.net.MalformedURLException;
  6. importjava.net.URL;
  7. importjava.util.HashMap;
  8. importandroid.graphics.drawable.Drawable;
  9. importandroid.os.Handler;
  10. importandroid.os.Message;
  11. publicclassAsyncImageLoader{
  12. privateHashMap<String,SoftReference<Drawable>>imageCache;
  13. publicAsyncImageLoader(){
  14. imageCache=newHashMap<String,SoftReference<Drawable>>();
  15. }
  16. publicDrawableloadDrawable(finalStringimageUrl,finalImageCallbackimageCallback){
  17. if(imageCache.containsKey(imageUrl)){
  18. SoftReference<Drawable>softReference=imageCache.get(imageUrl);
  19. Drawabledrawable=softReference.get();
  20. if(drawable!=null){
  21. returndrawable;
  22. }
  23. }
  24. finalHandlerhandler=newHandler(){
  25. publicvoidhandleMessage(Messagemessage){
  26. imageCallback.imageLoaded((Drawable)message.obj,imageUrl);
  27. }
  28. };
  29. newThread(){
  30. @Override
  31. publicvoidrun(){
  32. Drawabledrawable=loadImageFromUrl(imageUrl);
  33. imageCache.put(imageUrl,newSoftReference<Drawable>(drawable));
  34. Messagemessage=handler.obtainMessage(0,drawable);
  35. handler.sendMessage(message);
  36. }
  37. }.start();
  38. returnnull;
  39. }
  40. publicstaticDrawableloadImageFromUrl(Stringurl){
  41. URLm;
  42. InputStreami=null;
  43. try{
  44. m=newURL(url);
  45. i=(InputStream)m.getContent();
  46. }catch(MalformedURLExceptione1){
  47. e1.printStackTrace();
  48. }catch(IOExceptione){
  49. e.printStackTrace();
  50. }
  51. Drawabled=Drawable.createFromStream(i,"src");
  52. returnd;
  53. }
  54. publicinterfaceImageCallback{
  55. publicvoidimageLoaded(DrawableimageDrawable,StringimageUrl);
  56. }
  57. }
以上代码是实现异步获取图片的主方法,SoftReference是软引用,是为了更好的为了系统回收变量,重复的URL直接返回已有的资源,实现回调函数,让数据成功后,更新到UI线程。
几个辅助类文件:

  1. packagecn.wangmeng.test;
  2. publicclassImageAndText{
  3. privateStringimageUrl;
  4. privateStringtext;
  5. publicImageAndText(StringimageUrl,Stringtext){
  6. this.imageUrl=imageUrl;
  7. this.text=text;
  8. }
  9. publicStringgetImageUrl(){
  10. returnimageUrl;
  11. }
  12. publicStringgetText(){
  13. returntext;
  14. }
  15. }
  1. packagecn.wangmeng.test;
  2. importandroid.view.View;
  3. importandroid.widget.ImageView;
  4. importandroid.widget.TextView;
  5. publicclassViewCache{
  6. privateViewbaseView;
  7. privateTextViewtextView;
  8. privateImageViewimageView;
  9. publicViewCache(ViewbaseView){
  10. this.baseView=baseView;
  11. }
  12. publicTextViewgetTextView(){
  13. if(textView==null){
  14. textView=(TextView)baseView.findViewById(R.id.text);
  15. }
  16. returntextView;
  17. }
  18. publicImageViewgetImageView(){
  19. if(imageView==null){
  20. imageView=(ImageView)baseView.findViewById(R.id.image);
  21. }
  22. returnimageView;
  23. }
  24. }
ViewCache是辅助获取adapter的子元素布局

  1. packagecn.wangmeng.test;
  2. importjava.util.List;
  3. importcn.wangmeng.test.AsyncImageLoader.ImageCallback;
  4. importandroid.app.Activity;
  5. importandroid.graphics.drawable.Drawable;
  6. importandroid.view.LayoutInflater;
  7. importandroid.view.View;
  8. importandroid.view.ViewGroup;
  9. importandroid.widget.ArrayAdapter;
  10. importandroid.widget.ImageView;
  11. importandroid.widget.ListView;
  12. importandroid.widget.TextView;
  13. publicclassImageAndTextListAdapterextendsArrayAdapter<ImageAndText>{
  14. privateListViewlistView;
  15. privateAsyncImageLoaderasyncImageLoader;
  16. publicImageAndTextListAdapter(Activityactivity,List<ImageAndText>imageAndTexts,ListViewlistView){
  17. super(activity,0,imageAndTexts);
  18. this.listView=listView;
  19. asyncImageLoader=newAsyncImageLoader();
  20. }
  21. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  22. Activityactivity=(Activity)getContext();
  23. //InflatetheviewsfromXML
  24. ViewrowView=convertView;
  25. ViewCacheviewCache;
  26. if(rowView==null){
  27. LayoutInflaterinflater=activity.getLayoutInflater();
  28. rowView=inflater.inflate(R.layout.image_and_text_row,null);
  29. viewCache=newViewCache(rowView);
  30. rowView.setTag(viewCache);
  31. }else{
  32. viewCache=(ViewCache)rowView.getTag();
  33. }
  34. ImageAndTextimageAndText=getItem(position);
  35. //LoadtheimageandsetitontheImageView
  36. StringimageUrl=imageAndText.getImageUrl();
  37. ImageViewimageView=viewCache.getImageView();
  38. imageView.setTag(imageUrl);
  39. DrawablecachedImage=asyncImageLoader.loadDrawable(imageUrl,newImageCallback(){
  40. publicvoidimageLoaded(DrawableimageDrawable,StringimageUrl){
  41. ImageViewimageViewByTag=(ImageView)listView.findViewWithTag(imageUrl);
  42. if(imageViewByTag!=null){
  43. imageViewByTag.setImageDrawable(imageDrawable);
  44. }
  45. }
  46. });
  47. if(cachedImage==null){
  48. imageView.setImageResource(R.drawable.default_image);
  49. }else{
  50. imageView.setImageDrawable(cachedImage);
  51. }
  52. //SetthetextontheTextView
  53. TextViewtextView=viewCache.getTextView();
  54. textView.setText(imageAndText.getText());
  55. returnrowView;
  56. }
  57. }
ImageAndTextListAdapter是实现ListView的Adapter,里面有个技巧就是imageView.setTag(imageUrl),setTag是存储数据的,这样是为了保证在回调函数时,listview去更新自己对应item,大家仔细阅读就知道了。
最后贴出布局文件:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="horizontal"
  4. android:layout_width="fill_parent"
  5. android:layout_height="wrap_content">
  6. <ImageViewandroid:id="@+id/image"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. />
  10. <TextViewandroid:id="@+id/text"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"/>
  13. </LinearLayout>





分享到:
评论

相关推荐

    android listView 异步加载图片

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

    Android实现Listview异步加载网络图片并动态更新的方法

    本文实例讲述了Android实现Listview异步加载网络图片并动态更新的方法。分享给大家供大家参考,具体如下: 应用实例:解析后台返回的数据,把每条都显示在ListView中,包括活动图片、店名、活动详情、地址、电话和...

    Android Listview异步加载图片

    本文将深入探讨Android ListView中异步加载图片的策略、常见问题以及解决方案。 首先,我们要理解异步加载的基本原理。异步加载是指在后台线程中执行耗时操作,如加载图片,而主线程则继续处理用户交互,保证界面...

    Android ListView异步加载图片

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

    ListView异步加载图片

    为了解决这个问题,我们需要实现ListView的异步加载图片功能。本篇文章将详细介绍如何通过软引用缓存图片,实现高效、流畅的异步加载机制。 一、异步加载原理 异步加载的基本思想是将耗时的操作(如网络请求和图片...

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

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

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

    因此,我们需要采用异步加载图片的方式,同时为了优化性能,通常会采用双缓存策略。本文将详细介绍如何在ListView中实现图片的异步加载,并且在用户拖动时不加载,以提高滚动流畅性。 一、异步加载原理 异步加载是...

    Android实现ListView异步加载图片的方法

    因此,Android实现ListView异步加载图片是非常重要的优化手段。以下是对这个主题的详细解释。 1. **异步加载原理**: - 异步加载是指在后台线程中执行耗时操作,不阻塞主线程,从而提高应用的响应速度和流畅性。 ...

    android中ListView异步加载图片错位

    为了解决“android中ListView异步加载图片错位”这一问题,开发者可以采取以下几种策略: 1. 使用 ViewHolder 设计模式:ViewHolder模式能提高ListView的滚动性能,通过缓存convertView中的视图对象,避免了频繁的...

    ListView异步加载图片进度条

    综上所述,实现ListView中的异步加载图片进度条,需要综合运用多线程、图片缓存、UI更新等技术,并遵循良好的代码组织和错误处理原则。通过合理的封装和接口设计,可以使得代码更加规范,同时也提升了用户体验。

    listview 异步加载网络图片

    10. **总结**:在Android的ListView中实现异步加载网络图片,需要结合异步处理框架、选择合适的图片库、优化缓存策略、合理管理内存,并对ListView进行优化。通过这些手段,可以显著提升应用的性能和用户体验。

    android中ListView异步加载图片时的图片错位问题解决方案

    通过以上方法,我们可以有效地解决Android ListView中异步加载图片时出现的图片错位问题,提供流畅且高效的用户体验。在实际开发中,应根据项目的具体需求,灵活运用各种策略,实现最佳的图片加载效果。

    listview异步加载.rar

    在本压缩包文件"listview异步加载.rar"中,我们很可能会找到关于如何实现ListView异步加载的相关资料。 在Android中,ListView的异步加载通常涉及以下几个关键知识点: 1. **Adapter**:Adapter是连接ListView与...

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

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

    android ListView异步加载图片示例

    这个“android ListView异步加载图片示例”就是为了解决这个问题。 首先,我们要理解ListView的机制。ListView通过复用视图(convertView)来提高性能,即只有当前屏幕可见的几项会创建View,其余的View会在滚动时...

Global site tag (gtag.js) - Google Analytics