为什么80%的码农都做不了架构师?>>>   

先说一下思路,开始让一张放在res/drawable里的图片代替网络图片,加进ListItem,现在显示的就是本地图片,然后新开一个线程循环下载网络图片,每下完一张,替换原来显示的本地图片,更新ListView。

刚开始做的时候,乱配器用的是SimpleAdapter,但是后来发现,SimpleAdapter只能加载事先放在res/drawable,不能加载Bitmap,或者是Drawable,于是写了个适配器来继承SimpleAdapter,加入Bitmap支持,完美实现以上功能。

final ListView list = (ListView) findViewById(R.id.favlv);list.setDivider(null);list.setOnItemClickListener(Click);MyAdapter listItemAdapter;ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();cursor=db.query("fav",new String[]{"id","title","url","thumb"},null,null,null,null,"id DESC");UrlArr.clear();ThumbArr.clear();ItemID.clear();if(cursor.getCount()>0){nofav.setVisibility(View.INVISIBLE);}while(cursor.moveToNext()){ HashMap<String, Object> map = new HashMap<String, Object>();  map.put("ItemImage",R.drawable.load);//图像资源的ID  map.put("ItemTv",cursor.getString(1));listItem.add(map);UrlArr.add(cursor.getString(2));ThumbArr.add(cursor.getString(3));ItemID.add(cursor.getString(0));}cursor.close();//以上内容是读取数据库,并把数据加到listItem上,没有数据库的自己看着改,ThumbArr存放的是图片URL,另两个是我项目里用的listItemAdapter = new MyAdapter(this,listItem,R.layout.favlv,new String[] {"ItemImage","ItemTv"},new int[] {R.id.ItemImage,R.id.ItemTv});  list.setAdapter(listItemAdapter);list.setOnCreateContextMenuListener(MenuLis);//新开线程循环下载图片new Thread(){@SuppressWarnings("unchecked")public void run(){int i=0;while(i<ThumbArr.size()){try {URL uri = new URL(ThumbArr.get(i));URLConnection conn = uri.openConnection();conn.connect();InputStream is = conn.getInputStream();Bitmap bmp=BitmapFactory.decodeStream(is);is.close();HashMap<String, Object> map = (HashMap<String, Object>)listItemAdapter.getItem(i);map.put("ItemImage",bmp);                        handler.sendEmptyMessage(0);//这个是更新通知就是listItemAdapter.notifyDataSetChanged();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}i++;}}}.start();

下面的是MyAdapter适配器代码:

package com.BottomMenu;import java.util.List;import java.util.Map;import android.content.Context;import android.graphics.Bitmap;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.Checkable;import android.widget.ImageView;import android.widget.SimpleAdapter;import android.widget.TextView;public class MyAdapter extends SimpleAdapter {private int[] mTo;private String[] mFrom;private ViewBinder mViewBinder;private List<? extends Map<String, ?>> mData;private int mResource;private int mDropDownResource;private LayoutInflater mInflater;public MyAdapter(Context context,List<? extends Map<String, ?>> data, int resource, String[] from,int[] to) {super(context, data, resource, from, to);mData = data;mResource = mDropDownResource = resource;mFrom = from;mTo = to;mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}/*** @see android.widget.Adapter#getView(int, View, ViewGroup)*/public View getView(int position, View convertView, ViewGroup parent) {return createViewFromResource(position, convertView, parent, mResource);}private View createViewFromResource(int position, View convertView,ViewGroup parent, int resource) {View v;if (convertView == null) {v = mInflater.inflate(resource, parent, false);final int[] to = mTo;final int count = to.length;final View[] holder = new View[count];for (int i = 0; i < count; i++) {holder[i] = v.findViewById(to[i]);}v.setTag(holder);} else {v = convertView;}bindView(position, v);return v;}private void bindView(int position, View view) {final Map dataSet = mData.get(position);if (dataSet == null) {return;}final ViewBinder binder = mViewBinder;final View[] holder = (View[]) view.getTag();final String[] from = mFrom;final int[] to = mTo;final int count = to.length;for (int i = 0; i < count; i++) {final View v = holder[i];if (v != null) {final Object data = dataSet.get(from[i]);//                if(data i)String text = data == null ? "" : data.toString();if (text == null) {text = "";}boolean bound = false;if (binder != null) {bound = binder.setViewValue(v, data, text);}if (!bound) {if (v instanceof Checkable) {if (data instanceof Boolean) {((Checkable) v).setChecked((Boolean) data);} else {throw new IllegalStateException(v.getClass().getName() +" should be bound to a Boolean, not a " + data.getClass());}} else if (v instanceof TextView) {// Note: keep the instanceof TextView check at the bottom of these// ifs since a lot of views are TextViews (e.g. CheckBoxes).setViewText((TextView) v, text);} else if (v instanceof ImageView) {if (data instanceof Integer) {setViewImage((ImageView) v, (Integer) data);                            } else if(data instanceof Bitmap) {setViewImage((ImageView) v, (Bitmap)data);}} else {throw new IllegalStateException(v.getClass().getName() + " is not a " +" view that can be bounds by this SimpleAdapter");}}}}}public void setViewImage(ImageView v, int value) {v.setImageResource(value);}public void setViewImage(ImageView v, Bitmap bm) {((ImageView) v).setImageBitmap(bm);}};

转载于:https://my.oschina.net/dsm/blog/144377

ListView通过自定义的Adapter实现异步下载显示网络图片相关推荐

  1. android listview使用自定义的adapter没有了OnItemClickListener事件解决办法

    在使用listview的时用使用自定义的adapter的时候,如果你的item布局中包含有Button,Checkable继承来的所有控件,那么你将无法获取listview的onItemClickLi ...

  2. Android异步下载网络图片(其三:ExecutorService)

    在第一节中,我们使用Handler.Thread/Runnable .URL.HttpURLConnection等等来进行异步下载网络图片.然后第二节中换了AsyncTask方式.那么这一节我们再应用 ...

  3. ListView通过自定义适配器来显示数据并对Item项以及子view项的控件实现监听.

    本篇主要功能. 通过xml pull解析得到数据,然后通过自定义的Adapter绑定数据源,ListView绑定适配器,并且实现Item项的点击事件以及子View控件的点击事件. 一.实体类. Boo ...

  4. Scrapy图片分类异步下载

    可在pipeline中自定义一个图片类来继承Scrapy的图片类(ImagesPipeline[可以实现异步下载]),并重写ImagesPipeline的方法,来实现图片的异步下载 Scrapy的Im ...

  5. Swift多线程:使用GCD实现异步下载图片

    GCD属于系统及的线程管理,功能很强大,比上两次咱们分享的Operation要强大.有很多老前辈们已经创造了非常非常多的资料介绍GCD,因为大家都是把GCD放在了多线程内容分享的最开始,所以导致好多好 ...

  6. [Swift]在不依赖三方库的情况下如何异步下载和缓存图片?

    在可滚动视图(如UITableView)中异步加载大量图片是一个很常见的任务. 然而,在图片正在下载的同时又要保持应用程序流畅滚动,可能有点挑战. 许多开发人员依靠像Alamofire和SDWebIm ...

  7. Android异步下载

    概述 实现App常见下载公共 支持通知栏显示 支持 暂停.取消功能,使用Service.AsyncTask实现异步下载.特点简单.实用.方便源码扩展修改 详细 代码下载:http://www.demo ...

  8. Android多线程分析之一:使用Thread异步下载图像

    打算整理一下对 Android Framework 中多线程相关知识的理解,主要集中在 Framework 层的 Thread, Handler, Looper, MessageQueue, Mess ...

  9. Android异步下载网络图片(其二:AsyncTask)

    在上一节中,我们使用Handler.Thread/Runnable .URL.HttpURLConnection等等来进行异步下载网络图片. 但是采用这种方式有一些缺点,如下: 线程的开销较大,如果每 ...

最新文章

  1. 使用OpenCV实现摄像头测距
  2. 大三Java实习总结网易百度小米美团阿里(均拿offer)
  3. [翻译] DTCoreText 从HTML文档中创建富文本
  4. oracle 被另一个用户锁定
  5. python处理时间加减
  6. mxnet基础到提高(5)-- 卷积神经网络基础(1)
  7. C语言变量初始化是必须的吗?不初始化会怎样?
  8. js php调用webservice,js跨域调用WebService的使用方法
  9. Django框架(26.Django中的CSRF以及登录装饰器)
  10. darknet: ./src/parser.c:348: parse_region: Assertion `l.outputs == params.inputs' failed.yolov3训练问题
  11. 临界区、互斥量、信号量、事件的区别
  12. 深入理解.bin文件和.nb0文件的结构
  13. Linux 下 Weblogic 的安装 、配置以及发布
  14. 胡萝卜,是鸡蛋,还是咖啡豆
  15. Wsus 清理的计划任务
  16. LabView-之1: 串口驱动
  17. 研究发现多种精神疾病和肠道微生物群的紊乱有关
  18. Spark History Server 没有生效
  19. 使用mybatis拦截器实现业务层和持久化层的数据处理、加密、解密、脱敏。
  20. php writeup,writeup---你真的会PHP吗?

热门文章

  1. Facebook打算与Google的人工智能一较高下吗?
  2. 大揭秘:程序员工作也可以成为享受!
  3. 一个web.Config或app.Config自定义段configSections的示例
  4. 超越halcon速度的二值图像的腐蚀和膨胀,实现目前最快的半径相关类算法(附核心源码)。...
  5. Tomcat在windows中解压war包失败问题
  6. 更上层楼:动态安装你的windows服务
  7. KMP- Knuth-Morris-Pratt 字符串查找算法
  8. 更清晰的认识对象——深拷贝与浅拷贝
  9. Struts2中导入外部xml文件出现Included file cannot be found错误!
  10. Nginx的配置文件