转载 http://www.cnblogs.com/chon/archive/2011/06/28/2092317.html
Why ListView?
ListView 如果仅仅出于功能上的需求ListView可能没有存在的必要,ListView能作的事情基本上ScrollView也能胜任。ListView存在的最根本的原因在于它的高效(如何实现的? ).ListView 通过对象的复用从而减少内存的消耗,也减少了对象的创建从而也减少的cpu的消耗(在Androidk中创建View对象经常伴随着解析xml)。 ListView的本质是一张bitmap(当然所有的控件文字等在屏幕上看到的最终都会变成bitmap),ListView会按照需求,根据 Adapter提供的信息把需要的Item画出来显示在屏幕上,当屏幕滚动的时候会重新计算Item的位置并绘制出新的bitmap显示在屏幕上。这样听 起来感觉可能不是很高效,但这样带的好处就是,每用为一第个Item 创建一个View对象,样式一样的对象可以共用一个View对象,减少了内存的消耗。而且ListView是事件驱动的,只有当需要的时候才会重新绘制,并且只会 绘制当前屏幕上所显示的Items.
How To Use?
ListView 离不开Adapter,通常的作法创建一个类继承BaseAdapter,Override getCount()和getView()等方法。生成这个类的对象,调用ListView的setAdapter()与ListViw进行绑定。
How Does It work?
ListView会调用跟其绑定的Adapter的getCount()方法知道有多少个Item需要展示,然后循环调用getView(int position, View convertView, ViewGroup parent)知道第position个Item该怎么画,并画出来直到把当前的ListView的空间填满。当Adapter当中的数据改变时,需调用 notifyDataSetChanged ()告诉Adapter数据发生了变化或者给Adapter注册一个观察者registerDataSetObserver (DataSetObserver observer)。当Adapter得知与其绑定的数据己发生改变时间,会再次调用getCount()方法,并循环调用getView(int position, View convertView, ViewGroup parent)刷新当前页面。
当这个ListView 向上滚动需要创建一个Item9 同时,有些对象(比如Item1 )不在显示区域将看不到,这时android 将会把item1 的 引用传递给 Adapter.getView() 中的convertView这样我们就不用再创建一个View来存放Item9,只需要把原来的item1对象作下修改,就可以重复使用了 ;我们也不用担心convertView 是不是正确的类型,这个由系统保证,所以我们要作的就是把convertView 转换(经常需要向下转型)成我们自己的View 再给它赋值,in this case :(TextView) convertView.setText(“Item9”);
public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { //this would be first time to show the item,so we need to create it convertView = mInflater.inflate(R.layout.item, null); } //we grab the convertView,modify it and reuse it ((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]); return convertView; }
调用方法所需要的消耗要比访问变量高得多,而上面的代码一次又一次的调用findViewById()方法,作着重复的事情。所以我们可以进一步进 行如下优化: 创建一个类用来保存一些View的引用,这样我们就可以直接使用,而不用再调用findViewById().因为我们所保存的只是引用不是对象本身,所 以不用担心会占用大量内存
static class ViewHolder { TextView text; ImageView icon; } public View getView(int position, View convertView, ViewGroup parent){ ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item_icon_text, null); holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById(R.id.text); holder.icon = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } //we store the reference ,so that we don’t have to call findViewById() over and over again holder.text.setText(DATA[position]); holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2); return convertView; }
上图是T-mobile g1上采集的的数据,现在看来可能现在不是很准确,但其性能上的差异还是很有参考价值的。
Tips & Tricks
ListView是为了大容量数据展示而设计的。如果数据量(Item的数量)不是很大,且用ListView实现起来比较麻烦,不妨换种思路,不使用ListView,而用ScrollView来实现。
如果Item信息布局比较复杂或者Item的数量很多,出于性能的考虑,建议自定义一个View组件实现需要的功能,而不是组合其它控件达到所要的效果。
ListView滚动变黑:在xml中给ListView增加一个属性android:cacheColorHint="#00000000" 。当ListVIew中有很多Item,有时候需要快速的滚动。比如从第一个Item滚动到第600个Item这个时候,中间的很多Item对用户来说意 义不是很大,但android却要调用 adapter.getView()方法将这些Item逐一画出,并且因为滚动很快用户不希望有任何的延迟。这在一些低端手机比如g1,是很难作到的。所 以google工程师想出的一个办法是在滚动的时候,让屏幕变黑用一张黑色bitmap盖住ListView,而不去绘制中间过程中的很多Item,从而 提升性能。
Item有自己的背景盖住了Selector光标:在xml中给ListView增加一个属性:android:drawSelectorOnTop="true"这样光标就会跑到Item上面的图层,解决我们的问题。
Snippets
多选框ListView
带有进度条的ListView ,多个子线程刷新各自的进度,如果子线程很多那么刷新就会变得很频繁,我们可以由一个handler负责统一刷新,这样我们就要以增加一些额外条件限制刷新的次数和条件
分批加载的原理很简单 ,给ListView添加一个OnScrollListener监听滚动事件,当用户滚动到屏幕到特定的位置时加载新数据,并给LIstView加一个正在加载的footerView,当加载数据结束时再把这个footerView去掉。
如果有什么疑问,发现bug或者有更好的想法或者建议,或者附件无法下载。
相关推荐
在这个场景中,我们讨论的是如何在ListView中集成多选框、实现动态加载,并利用多线程来刷新进度条,提高用户体验。 首先,关于ListView中的多选框,这通常涉及到Adapter的自定义。在Adapter的getView()方法中,...
本示例主要讲解如何在ListView中实现CheckBox的多选效果,并结合动态加载数据的功能,以提供更好的用户体验。以下将详细介绍相关知识点: 1. **ListView基础**: - ListView是一种可滚动的视图,用于显示一列数据...
`ListView`的下拉刷新功能是提升用户体验的重要特性,特别是在处理动态加载数据的应用场景中。这个“android--ListView下拉刷新demo”就是一个实例,旨在帮助新手理解并实现这一功能。 `ListView`的下拉刷新通常...
android ListView item下载 ListView 进度条下载 ListView多个下载 android:ListView的局部刷新 Android中自定义Adapter实现ListView动态刷新进度条 android listview局部刷新和模拟应用下载
这个"Android--ListView滚动到底部自动加载下页数据Demo"是实现一个常见的功能:无限滚动加载,也称为下拉刷新和上拉加载更多。这种功能在许多社交应用、电商应用中广泛应用,当用户滚动到列表底部时,会自动加载更...
本资源"安卓listview相关相关-Android--ListView返回第一条数据的实现.rar"主要关注如何实现在ListView中快速定位到第一条数据。以下是对这一主题的详细讲解。 首先,ListView的工作原理基于Adapter模式,它将数据...
然而,当这个列表包含许多图片时,如果直接在主线程中加载,会导致应用性能下降,甚至出现ANR(Application Not Responding)错误。因此,为了提高用户体验,我们需要在Android中实现ListView图片的异步加载。本...
在Android开发中,ListView是一种常用的UI组件,常用于展示大量数据列表。本教程将详细介绍如何在ListView中实现带标题栏的效果。标题栏通常用于显示分类信息或者操作按钮,为用户提供更好的交互体验。以下是对实现...
在Android开发中,下拉刷新(Pull-to-Refresh)功能是一种常见的用户交互设计,它允许用户通过在列表顶部向下拉动来加载更多数据或更新现有内容。`android-pulltorefresh-listview`是一个专为ListView实现下拉刷新...
在Android开发中,ListView是一...综上,"ListView实现动态加载"涵盖了Android开发中的数据适配、视图复用、异步加载、滚动监听、内存优化等多个重要知识点。熟练掌握这些技巧,对于构建流畅、高效的列表界面至关重要。
•Android---UI篇---Tab Layout(选项卡布局) • •Andorid---UI篇---TableLayout(表格布局) • •Android---UI篇---RelativeLayout(相对布局) • •Android---UI篇---GridView(网格布局) • •Android---UI篇-...
总结,"android-pro-listview.7z"涵盖了ListView的各个方面,无论你是初学者还是经验丰富的开发者,都能从中获取宝贵的知识,提升对ListView的理解和使用技巧。通过深入学习,你将能够应对各种复杂的列表展示需求,...
在Android开发中,ListView是一种非常常见的控件,用于展示大量数据列表。然而,为了提供更好的用户体验,许多应用都需要实现上拉刷新功能,让用户能够轻松获取更多数据。本压缩包"Android代码-listview上拉刷新.zip...
总结,实现ListView的下拉刷新功能是Android应用开发中的一个重要环节,它提升了用户体验并确保数据的实时性。通过自定义ListView或使用第三方库,开发者可以轻松实现这一功能。在实践中,不断优化和改进,以提供更...
在Android开发中,ListView是一种常用的UI组件,用于展示大量数据列表。它允许用户滚动查看不同条目,并且在处理大数据集时,实现分页功能是非常重要的优化策略。本压缩包"Android代码-ListView分页功能源码.zip...
本自学笔记将重点讲解如何在Android项目中创建并使用ListView,包括基本的设置、数据绑定和适配器的使用。 首先,我们需要在布局文件中添加ListView元素。在XML布局文件中,通过`<ListView>`标签定义ListView,可以...
这个"Android-ListView-Example"项目显然旨在教你如何在Android应用中有效地使用ListView。以下是对这个主题的详细说明: 1. **ListView的基本概念**:ListView是一个视图容器,它能够显示一组可滚动的项目列表。每...
本资源"Android高级应用源码-listview下拉刷新加载更多.rar"提供了一个关于ListView实现下拉刷新和加载更多的示例源码,这对于开发者来说是很有价值的学习资料。下面我们将详细探讨这两个功能的实现原理和关键知识点...
在本教程中,我们将深入探讨如何在ListView中实现这些功能,并且还会讨论如何开关上拉加载更多的功能。 首先,下拉刷新功能通常用于刷新当前列表的数据,当用户在ListView顶部向下滑动时触发。在Android中,我们...
《Android下拉刷新ListView详解——基于android-pulltorefresh库》 在移动应用开发中,用户界面的交互性与用户体验至关重要。其中,下拉刷新功能已成为许多Android应用的标准特性,尤其是在显示列表数据的场景中。`...