- 浏览: 1031201 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (675)
- ios (214)
- android-course (5)
- unity3d (7)
- cocos2d (36)
- html5 (3)
- game (5)
- android (42)
- java (57)
- php (12)
- 创业 (10)
- SEO (3)
- 架构 (2)
- 数据库 (3)
- 产品设计 (9)
- 操作系统 (10)
- Web前端 (11)
- 其他 (50)
- GAE (1)
- mac os (8)
- Open Source (2)
- 序列号 (10)
- C (2)
- database (2)
- 算法 (6)
- 设计模式 (1)
- photoshop (1)
- 3dmax (1)
- maya (1)
- opengl (3)
- 游戏设计 (1)
- 趋势 (1)
- cocos2d-x (4)
- shell (3)
- c++ (30)
- lua (5)
- flash (1)
- spring (3)
- mysql (4)
- Git (6)
- xmpp (1)
- cocos2dx (14)
- mac (2)
- 编程规范 (2)
- windows (1)
- linux (5)
- coocs2dx (1)
- ubuntu (2)
- aws (1)
- OPENGLES (1)
- 原画 (1)
最新评论
-
jlees:
Best mobile app testing tool pc ...
iOS + XCode 4 + GHUnit = Mobile TDD+Continuous testing -
ipanda:
楼主,能否给一个Micro CloudFoundry的虚机或者 ...
Cloud Foundry使用及开发向导 -
love_zongming:
谢谢分享。。
visio2007序列号 -
雨花台舞水:
你这才是枪文把
套在 360 黑匣子外面的黑盒子:你被技术型枪稿吓到了么? -
hugh.wang:
改天试试
Mac版魔兽争霸3 1.24e下载
研究了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
- listview_webimg.rar (33.7 KB)
- 下载次数: 1595
评论
是的,这是我最初接触android时写到,几乎不能用于生产,只用于学习。
推荐一个文档,会对你有帮助
http://www.hulefei.com/?p=81
同意!
发表评论
-
Android监听键盘是否弹出,以及获取软键盘的高度
2015-07-02 19:31 1493网上介绍过监听键盘是否弹出的方法,我自己也是尝试过,不是 ... -
linux安装android NDK
2015-04-20 19:14 1905Error:Execution failed for ta ... -
android studio 添加项目修改gradle2.2.3
2015-04-20 15:22 16041.build.gradle(Module:app) 去除对 ... -
Android.mk无需手动添加cpp文件(cocos2d-x 3.2正式版)
2014-09-11 14:41 1026LOCAL_PATH := $(call my-dir) ... -
cocos2dx 在android中编译
2014-08-08 17:11 8651在全局环境变量中设置NDK_ROOT -
android实现通过浏览器点击链接打开本地应用(APP)并拿到浏览器传递的数据
2014-08-07 16:54 2563为了实现这个功能可折腾了我好久,先上一份代码,经楼主验证是绝 ... -
用Gradle 构建你的android程序
2014-03-21 17:15 836前言 android gradle 的插 ... -
Hackborn的吐槽和Munn的剖析: Android graphics低性能背后的真像
2013-10-23 14:52 796Google+上有意思的讨论 ... -
mac 不识别 android samsung手机
2013-10-21 16:30 1890使用Mac开发Android时,有可能无法识别手机,可以通过 ... -
Mac下配置Android NDK环境并搭建Cocos2d-x环境并Eclipse正常编译运行Cocos2dX自带TestsDemo项目!
2013-04-04 00:58 1224大家都知道Cocos2d-X是个多平台支持的游戏引擎,那么 ... -
让Java跟Javascript更加亲密
2013-04-02 22:30 1147在移动App开发中,为了快速迭代,通常都会使用Native+ ... -
技术文章收藏夹
2013-02-13 19:59 819COCOS2D-X跨ANDROID&IOS平台开发入 ... -
eclipse failed to create the java virtual machine 问题图文解析
2013-01-27 11:16 688解决方法: 1.问题现象 2.java虚拟机初始化失败 ... -
cocosd-android原来是个山寨货
2012-06-13 09:25 9791、技术团队无优势:Cocos2D-Android版本与iPh ... -
How Secure Are Query Strings Over HTTPS?
2012-03-09 12:29 1269A common question we hear is ... -
Android禁止横屏竖屏切换
2012-04-20 00:13 1702在AndroidManifest.xml的activity(需 ... -
Facebook还发布了Ringmark手机浏览器测试套件
2012-02-28 09:17 1100Facebook还发布了Ringmark手机浏览器测试套件 -
图解 Android 广播机制
2012-02-16 16:35 918从现实生活中理解广播机制 一听到广播我们第一感觉就会联 ... -
Handling Android 2.3 WebView's broken AddJavascriptInterface
2012-02-12 15:05 1461The Google Android team rele ... -
Error executing aapt解决
2012-02-11 23:31 4562安装完SDK和ADT时貌似出现些问题。 Description ...
相关推荐
从网络加载图片显示到listview上,主函数布局是一个ListView item布局是TextView和ImageView 数量的多少视情况而定 再写一个网络请求数据的类 最后面有代码: ”urlConnection 请求数据类的封装“ 类名一定要一样...
然而,当ListView中的每一项都需要显示网络图片时,如果不进行优化,可能会导致性能问题,如界面卡顿、滚动不流畅等。这个问题的解决方法是高效地加载网络图片并自定义ListView的布局。 首先,我们需要了解异步加载...
可以使用Picasso、Glide等库加载网络图片,或者使用Android的Bitmap类处理本地图片。 4. 设置ListView:在Activity中,获取ListView实例,然后设置Adapter。例如,`listView.setAdapter(adapter)`。这一步将数据源...
本文将深入探讨如何在ListView中实现网络图片的加载与显示,以及解决图片错乱的问题。 首先,我们需要一个图片加载库来帮助我们处理网络图片的下载和显示。在Android社区中,有多个流行的图片加载库可供选择,如...
在Android开发中,ListView是展示大量数据的常用组件,但加载网络图片往往会给ListView的流畅性带来挑战。本文将深入探讨如何实现一个高性能的ListView,结合线程池和缓存管理来优化网络图片的加载。 首先,理解...
总之,"Listview显示网络图片"涉及到Android开发中的性能优化和用户体验设计。通过使用异步加载库如Glide,我们可以高效地在ListView中加载网络图片,同时保证应用的流畅性。同时,合理利用缓存和优化策略,可以...
在listview中显示网络图片,该类重写simpleadapter,让listview绑定该adapter
以上就是Android解析网络图片并显示在ListView中的主要知识点,这些技术和实践对于任何需要动态加载图片的Android应用来说都是至关重要的。在实际开发中,应根据项目需求和性能要求选择合适的方法和库。
"Listview显示网络图片demo--真正简单好用"是一个针对这些问题的解决方案,它提供了一个优雅且高效的实现方式,保证了用户体验的流畅性。 首先,我们需要理解ListView的工作原理。ListView通过复用已创建的列表项来...
在Android开发中,ListView是常用的数据展示控件,它能够高效地显示大量数据。然而,当ListView中的每个项都包含图片时,如果直接在主线程中加载图片,会导致UI卡顿,用户体验下降。为了解决这个问题,我们需要实现...
`这一行代码负责加载并显示网络图片。 当然,除了Picasso,还有其他如Glide、Fresco等优秀的图片加载库,它们都有各自的特点和优势。例如,Glide以其流畅的滚动和自动管理内存而受到欢迎,Fresco则提供了更高级的...
这里的“android listView 异步加载图片”指的是在不阻塞UI线程的情况下,从网络、本地存储或其他来源加载图片到ListView中的技术。 这篇名为“ImageLoader”的Java文件很可能就是一个实现图片异步加载的工具类。在...
本示例"android listview从mysql加载数据和图片"将介绍如何从MySQL数据库获取数据,并在ListView中显示这些数据以及对应的图片。这个过程涉及到Web服务端、Android客户端以及MySQL数据库的交互。 首先,我们需要在...
在Android开发中,ListView是展示大量数据常用的组件,但直接加载网络图片会遇到性能问题,如界面卡顿、内存溢出等。这个"Android高级应用源码-listview获取网络图片缓存优化.zip"是一个示例项目,旨在解决这些问题...
通过以上步骤,我们可以实现一个高效的图片异步加载方案,确保ListView在滚动时保持流畅,同时充分利用双缓存策略降低网络请求频率,提升应用性能。在实际项目中,可以根据需求选择合适的第三方库,或者自定义实现以...
这些库提供了方便的API,可以轻松地在ListView中加载网络图片或本地资源图片。以Glide为例,使用Glide可以简化代码,提高效率: ```java Glide.with(context) .load(url) .into(imageView); ``` 2. **使用...
这个"Android listview实现图片的异步加载Demo.zip"就是一个示例,它展示了如何在ListView中高效地加载网络或本地的图片。 首先,我们需要理解异步加载的基本原理。在Android中,我们通常使用AsyncTask或者Handler/...