研究了android两个礼拜,稍微有了点眉目,开始正式帮公司开发应用的时候,发现ListView没有现成的显示网络图片的类或方法,网上查了查也没找到好的解决方法。心一横,自己研究吧,现在把我的解决办法和大家分享一下。

使用ListView的方法就不在此介绍了,google一下都是的。

第一步:分析api

使用ListView都需要使用Adapter,而api中的adapter都继承自BaseAdapter,所以第一反应就是自己实现一个继承自BaseAdapter的adapter,但是BaseAdapter还是属于高度抽象的基类,所以实现起来还是还是有点难度的。此时作为初学者的你(当然我也是啦)应该最熟悉的是SimpleAdapter了吧,而且SimpleAdapter也可以实现在ListView显示图片,但是就是不能显示网络图片,只能显示在drawalbe中定义过的图片。所以就想,我是否可以改写SimpleAdapter的类,在它实例化drawalbe中图片时,我替换成我自己 的显示网络图片的方法呢?答案是肯定的!(想获取android的源码,可以查看我的另一篇文章http://hulefei29.iteye.com/blog/615016)

第二步:源码分析

经过查看源码SimpleAdapter发现,显示每个item视图都是通过调用(int position, View convertView, ViewGroup parent)方法来实现的

/*** @see android.widget.Adapter#getView(int, View, ViewGroup)*/public View getView(int position, View convertView, ViewGroup parent) {return createViewFromResource(position, convertView, parent, mResource);}

在getView(int position, View convertView, ViewGroup parent)中又调用了SimpleAdapter的私有方法createViewFromResource来组装View,在createViewFromResource中对SimpleAdapter的参数String[] from

和int[] to进行了组装,代码如下:

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

在createViewFromResource方法中又有一个bindView(position, v)方法对item中的各个View进行了组装,bindView(position, 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]);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 {setViewImage((ImageView) v, text);}} else {throw new IllegalStateException(v.getClass().getName() + " is not a " +" view that can be bounds by this SimpleAdapter");}}}}}

终于找到了对ViewImage进行组装的代码了“else if (v instanceof ImageView)”,我们留成功之差一步之遥了!

看到上面茫茫的代码是不是已经头晕了呢,其实以上的都是源代码,我没有做过任何的修改,也不需要修改,只是需要把它从SimpleAdapter中取出来进行覆盖,以为他们私有方法,不能用super调用!到最后终于到你出手的时候了,你需要重写SimpleAdapter类中的setViewText方法,SimpleAdapter对setViewText进行了重载,有两个方法,代码如下:

    public void setViewImage(ImageView v, int value) {v.setImageResource(value);}public void setViewImage(ImageView v, String value) {try {v.setImageResource(Integer.parseInt(value));} catch (NumberFormatException nfe) {v.setImageURI(Uri.parse(value));}}

setViewImage(ImageView v, int value) 你应该一看就熟悉了吧,int就是R中的索引值,但是你还看到SimpleAdapter居然还有一个setViewImage(ImageView v, String value)可以接受String的方法,在往下看就是知道了,如果不是索引,ImageView 也可以接受Uri的值来设置图片,切忌Uri不是Url,所以我们只需要改写一下这个方法就ok了,代码如下:

public void setViewImage(ImageView v, String value) {Bitmap bitmap = WebImageBuilder.returnBitMap(value);((ImageView) v).setImageBitmap(bitmap);}

我们用Bitmap 来对ImageView进行设置,WebImageBuilder.returnBitMap是我自己实现的获取网络图片的方法,当然google下都是的,在我下面的源码中也有,在这里就不多说了!说到这,我的解释也就说完了,希望可以给你帮助!如果你是不愿意跟着别人思路走的人,希望自己研究出来的话,那最后我也拿我的源码贴上,对有些朋友来说获取直接看源码,理解的更快吧!

最后强调一下,本文为胡乐费的原创,如果要转载的话,希望注明出处!

本文转自: http://hulefei29.iteye.com/blog/616262

android ListView显示网络图片相关推荐

  1. Android TextView显示网络图片

    前言:程序猿真的是有个通病啊,电梯上就在研究电梯的逻辑代码,走路看到红绿灯也会去研究算法,今天心情不错,于是就发了一个说说,发现某q空间中显示了我发的说说,但是我发的笑脸跟哭脸表情由于网络慢,很久才加 ...

  2. Android中显示网络图片

    本文参照自:  http://developer.51cto.com/art/201001/180968.htm 在Android中,显示网络图片还是比较简单的.当我们开始启动一个任务加载一个View ...

  3. android listview显示数据库内容

    1.   创建数据库与数据表的类 package com.mybook.listdemo;/*** Created by 182 on 2016/2/18.*/ import android.cont ...

  4. android listview动态加载网络图片不显示,Android Listview异步动态加载网络图片

    Android Listview异步动态加载网络图片 详见: http://blog.sina.com.cn/s/blog_62186b460100zsvb.html 标签: Android SDK ...

  5. android listview分页显示,Android应用中使用ListView来分页显示刷新的内容

    点击按钮刷新1.效果如下: 实例如下:  上图的添加数据按钮可以换成一个进度条  因为没有数据所以我加了一个按钮添加到数据库用于测试:一般在服务器拉去数据需要一定的时间,所以可以弄个进度条来提示用户: ...

  6. android listview 列加id,Android实战开发之ListView同一个item显示2列的实现方法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Android实战开发中,ListView控件用途十分广泛,各种自定义控件多种多样.当项目要求实现一个2列的商品列表形式的界面,我们首先肯定想到用List ...

  7. Android 自定义 ListView 显示网络上 JSON 格式歌曲列表

    本文内容 环境 项目结构 演示自定义 ListView 显示网络上 JSON 歌曲列表 参考资料 本文最开始看的是一个国人翻译的文章,没有源代码可下载,根据文中提供的代码片段,自己新建的项目(比较可恶 ...

  8. android显示多个网络图片不显示,Android显示网络图片实例

    本文实例讲述了Android显示网络图片的方法,分享给大家供大家参考.具体方法如下: 一般来说,在Android中显示一张网络图片其实是非常简单的,下面就是一个非常简单的例子: 步骤1: ① 创建你的 ...

  9. android查询mysql并显示_Android操作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的方法详解...

    本文实例讲述了Android操作SQLite数据库(增.删.改.查.分页等)及ListView显示数据的方法.分享给大家供大家参考,具体如下: 由于刚接触android开发,故此想把学到的基础知识记录 ...

最新文章

  1. php reactphp wss_workerman的基本用法(示例详解)
  2. 预防session劫持
  3. 如何设计出一个有灵魂的「签到功能」?
  4. word无法打开请去应用商店_word文档打不开的4种解决方法
  5. retinanet 部署_再谈RetinaNet
  6. NVIDIA英伟达GPU显卡算力一览(包含Tesla和GeForce、TITAN及RTX系列等)
  7. 网站+云服务器+价格表,网站+云服务器+价格表
  8. 通过DCF模型对股票进行估值
  9. 《数据分析-SmartChart02》SmartChart低代码平台-可视化开发
  10. 有向图php,【小龙的资结演算法秘籍】(8) 有向图(directed graph)及DAG(directed acyclic graph)的详细介绍...
  11. 2021年建筑架子工(建筑特殊工种)考试题库及建筑架子工(建筑特殊工种)模拟试题
  12. Python中的各种占位符
  13. msec是毫秒; usec是微秒
  14. 参加SODA数据比赛
  15. 简述工业机器人示教再现的一般步骤_工业机器人示教与初识编程语言
  16. Docker物理机重启后,docker报错 error creating overlay mount to /var/lib/docker/overlay2
  17. 用正则表达式抓取电话号码
  18. Cmder安装和配置
  19. [基因课学习笔记]一个简单的基因家族分析
  20. vue-router.esm-bundler.js6c0271 [Vue Router warn] No match found for location with path

热门文章

  1. CSS布局之流动布局(湖南中兴网信首页实例)
  2. 第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 A 组 C题
  3. rpad()函数:sql补齐字符
  4. 我用多线程优化了亿级流量电商业务下的海量数据校对系统,性能直接提升了200%!!(全程干货,建议收藏)
  5. 详细介绍外观设计专利的申请流程和费用
  6. java中emit的用法_emit的用法
  7. nginx域名301重定向
  8. hit 2952 //石子归并 的 平行四边形不等式解法
  9. 定时器循环彩灯实验c语言,单片机实验6__定时器控制循环彩灯实验.doc
  10. mysql bdb_深入了解mysql它BDB系列(1)---BDB基础知识