`
WilliamLiu
  • 浏览: 27069 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

ListView总结

 
阅读更多

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)刷新当前页面。

Item 1

Item 2

Item 3

Item 4

Item 5

Item 6

Item 7

Item 8

 

当这个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去掉。

 

 

http://www.cnblogs.com/chon/archive/2011/06/28/2092317.html

分享到:
评论

相关推荐

    ListView总结---关于ListView的一些分享

    在Android开发中,ListView是一个非常重要的组件,它用于展示大量数据的列表,具有滚动和复用视图的特点,能够高效地处理大量数据流。本文将深入解析ListView的工作原理及其使用技巧,结合`ContactListActivity分析....

    listview总结

    【ListView详解】 ListView是Android开发中的一个重要组件,用于以列表形式展示内容,可自适应数据长度,提供良好的滚动性能和用户交互体验。ListView的核心在于它与数据和视图的适配,通过适配器(Adapter)将数据...

    android的listview嵌套listview,列表嵌套列表 android studio版本

    总结来说,实现Android的ListView嵌套ListView需要理解ListView的工作机制,创建并管理两个Adapter,以及在布局文件中正确地嵌套ListView。这虽然不是特别高深的技术,但却是Android开发中常见的需求,熟练掌握能...

    ListView嵌套ListView的demo

    总结来说,"ListView嵌套ListView的demo"是关于如何在Android应用中构建一个多级列表视图的示例,它涉及到自定义组件、Adapter的使用以及性能和交互的优化。这样的技术对于处理层级数据,比如目录结构、组织架构或者...

    改变ListView网格颜色

    总结来说,改变VB中的ListView网格颜色主要涉及重写`OnPaint`事件,使用GDI+进行绘制,以及可能需要启用`OwnerDraw`模式进行更精细的自定义。通过这种方式,你可以自由地定制ListView的显示效果,使用户界面更加个性...

    listview-图片居中显示

    总结来说,要实现ListView在LargeIcon模式下图片居中显示,你需要自定义Adapter、创建适配的布局文件、设置Adapter并根据项目数量调整图片大小。通过这种方式,你可以灵活地控制ListView的显示效果,提供良好的用户...

    C#,winform,listView动态插入数据

    #### 六、总结 通过上述步骤,我们成功实现了在C# WinForms应用程序中动态地向`ListView`中插入数据的功能。这不仅包括了基本的数据插入操作,还包含了异常处理以及从数据库读取数据的操作。这些知识对于开发基于...

    C#下的自绘ListView,方便的在ListView中显示各种控件

    总结来说,自绘ListView是C#开发中提高ListView功能和灵活性的一种重要技术。通过自定义绘制和测量过程,我们可以将各种控件嵌入到列表项中,实现更丰富的用户界面。然而,这也需要开发者具备一定的图形绘制和控件...

    ListView 自动调整列宽

    ### 总结 通过上述两种方法,我们可以实现在 Windows Forms 应用程序中`ListView`的列宽自动调整功能。这两种方法各有优缺点:第一种方法简单易用,但可能不够精确;第二种方法虽然稍微复杂一些,但可以更准确地...

    WPF的ListView控件自定义布局用法实例

    总结起来,自定义WPF的ListView布局主要涉及以下几个步骤: 1. 创建ControlTemplate定义ListView的整体结构和行为。 2. 设计DataTemplate以定义每个ListViewItem的显示样式。 3. 使用数据绑定将数据模型与UI元素关联...

    treeview和listview结合使用的例子

    总结 `TreeView`和`ListView`是Windows Forms开发中的强大工具,结合使用可以构建出功能丰富的界面。通过事件监听和数据绑定,可以轻松实现类似资源管理器的功能,提供用户友好的交互体验。理解并熟练掌握这两种...

    android ListView 网格布局

    总结起来,创建一个Android的网格布局ListView主要涉及以下几个步骤:设计网格项布局、创建自定义Adapter、在Activity中设置GridView并加载数据。通过灵活地调整布局和Adapter,你可以实现各种复杂的网格布局效果。...

    ListView嵌套ListView

    总结来说,"ListView嵌套ListView"是一种复杂但实用的UI设计技巧,它可以用来呈现多级结构的数据。开发者需要掌握自定义Adapter、事件监听和性能优化等技能来成功实现这一功能。通过分析提供的文件列表,我们可以...

    ListView中动态添加数据

    总结,动态添加数据到Android的ListView涉及以下几个关键步骤:创建数据模型,实现自定义Adapter,设置ListView和Adapter,向数据源添加新数据并通知Adapter,以及考虑性能优化措施。通过熟练掌握这些技巧,开发者...

    ListView动态添加、移除item

    总结,动态添加和移除ListView的item是Android开发中常见的需求。通过理解ListView的工作原理,结合Adapter和数据源的管理,我们可以实现流畅且高效的列表操作。同时,利用优化技巧和动画效果,可以提升用户交互体验...

    操作ListView控件源码

    总结来说,ListView是Android开发中处理数据展示的核心控件,熟练掌握ListView的操作和优化技巧对提升应用性能至关重要。提供的源码实例将帮助初学者快速理解这些概念并进行实践。通过学习和实践,开发者可以创建出...

    ListView的基本使用带Button

    总结来说,ListView的基本使用包括创建ListView、定义条目布局、创建Adapter并实现数据绑定,以及处理点击事件。在实际应用中,还可以进一步优化性能,比如使用convertView复用条目视图,或者使用更高级的Adapter如...

    ListView添加CheckBox复选框

    总结起来,实现ListView中CheckBox复选框功能主要涉及以下步骤: 1. 创建自定义的ListView适配器,继承自BaseAdapter。 2. 在适配器的`getView()`方法中,设置CheckBox并处理点击事件。 3. 使用convertView提高性能...

    android 横向ListView 水平Listview DEMO

    总结起来,"android 横向ListView 水平Listview DEMO"是一个关于如何在Android应用中实现水平滚动列表的实例,它涵盖了使用HorizontalScrollView或RecyclerView的原理、自定义Adapter的数据绑定、事件监听以及性能...

Global site tag (gtag.js) - Google Analytics