ListView的异步加载图片

来源:互联网 发布:三星oculus 软件下载 编辑:程序博客网 时间:2024/05/01 04:52

//目录结构 和效果


//代码

//LenListViewAnyActivity.java 

package sn.len.list.any;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.widget.ListView;//也可以继承自ListView http://marshal.easymorse.com/archives/2662 这文章写得很不错public class LenListViewAnyActivity extends Activity{private ListView ListView_myListView;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);ListView_myListView=(ListView)findViewById(R.id.ListView_myListView);//这个是加路径,当然你也可以采有MD5加密的样子来做。。。List<NewsBean> newsBeanList=new ArrayList<NewsBean>();NewsBean bean=new NewsBean("http://avatar.profile.csdn.net/E/1/0/2_sgchen2000.jpg");NewsBean bean1=new NewsBean("http://avatar.profile.csdn.net/A/9/C/2_orietech.jpg");newsBeanList.add(bean);newsBeanList.add(bean1);//设置AdapterListViewAdapter listViewAdapter=new ListViewAdapter(newsBeanList,LenListViewAnyActivity.this);ListView_myListView.setAdapter(listViewAdapter);}}

//ListViewAdapter.java  Adapter类

package sn.len.list.any;import java.util.List;import android.content.Context;import android.graphics.drawable.Drawable;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;public class ListViewAdapter extends BaseAdapter{private List<NewsBean> newsBeanList;private Context context;private AnyLoadingImage anyLoadingImage=new AnyLoadingImage();public ListViewAdapter(List<NewsBean> newsBeanList,Context context){this.newsBeanList=newsBeanList;this.context=context;}@Overridepublic int getCount(){return this.newsBeanList.isEmpty()?0:newsBeanList.size();}@Overridepublic Object getItem(int position){return null;}@Overridepublic long getItemId(int position){return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent){System.out.println("getView");View view=convertView;if(view==null){view=LayoutInflater.from(context).inflate(R.layout.item, null);//填充布局NewsBean newBean=this.newsBeanList.get(position);String url=newBean.getImage();//得到图片的确url路径final ImageView ImageView_myImageView=(ImageView) view.findViewById(R.id.ImageView_myImageView);if(anyLoadingImage.can(url)) //true:若缓存中存在,直接重缓存中拿{Drawable drawable=anyLoadingImage.getFromCache(url);//重缓存中拿ImageView_myImageView.setImageDrawable(drawable);System.out.println("cache");}else//false:重网络下载并保存在缓存中{anyLoadingImage.DownLoadImageOnSurf(url,new ICallBackManager(){@Overridepublic void refresh(String url, Drawable drawable){if(null!=url && null!=drawable){ImageView_myImageView.setImageDrawable(drawable);//更新}}});}}return view;}}

//ICallBackManager.java 回调很简单,就一个方法

package sn.len.list.any;import android.graphics.drawable.Drawable;public interface ICallBackManager{void refresh(String url,Drawable drawable);}

//AnyLoadingImage.java 异步加载

package sn.len.list.any;import java.io.InputStream;import java.lang.ref.SoftReference;import java.net.URL;import java.util.HashMap;import java.util.Map;import android.graphics.drawable.Drawable;import android.os.Handler;import android.os.Message;public class AnyLoadingImage//异步加载{//定义Image缓存private Map<String,SoftReference<Drawable>> imageCache=new HashMap<String,SoftReference<Drawable>>();//检查Image缓存中是否存在该urlpublic boolean can(String url){if(imageCache.containsKey(url))//缓存中有图片{return true;}return false;//缓存中无图片}//下载public Drawable DownLoadImageOnSurf(final String url,final ICallBackManager iCallBackManager){final Handler handler=new Handler(){@Overridepublic void handleMessage(Message msg){System.out.println("msg:"+msg.what);if(msg.what==0){imageCache.put(url, new SoftReference<Drawable>((Drawable)msg.obj));//保存到缓存中iCallBackManager.refresh(url,(Drawable)msg.obj);//开始回调,执行更新}}};new Thread(){@Overridepublic void run(){try{InputStream inStream=new URL(url).openConnection().getInputStream();Drawable image=Drawable.createFromStream(inStream, "image");Message messge=handler.obtainMessage(0,image);handler.sendMessage(messge);} catch (Exception e){e.printStackTrace();}}}.start();return null;}public Drawable getFromCache(String url){SoftReference<Drawable> softDrawable=imageCache.get(url);Drawable drawable=softDrawable.get();return drawable;}}

//Bean.java 其实这里面,就是存放的个Image的URL

package sn.len.list.any;public class NewsBean{private String image;public String getImage(){return image;}public void setImage(String image){this.image = image;}public NewsBean(){}public NewsBean(String image){this.setImage(image);}}


原创粉丝点击