zoukankan      html  css  js  c++  java
  • Android ListView 的优化

    一、复用convertView,降低findViewById的次数

    1、优化一:复用convertView

    Android系统本身为我们考虑了ListView的优化问题。在复写的Adapter的类中,比較重要的两个方法是getCount()和getView()。界面上有多少个条显示。就会调用多少次的getView()方法;因此假设在每次调用的时候,假设不进行优化。每次都会使用View.inflate(….)的方法,都要将xml文件解析,并显示到界面上,这是很消耗资源的:由于有新的内容产生就会有旧的内容销毁,所以。能够复用旧的内容。

    优化:

    在getView()方法中。系统就为我们提供了一个复用view的历史缓存对象convertView。当显示第一屏的时候。每个item都会新创建一个view对象,这些view都是能够被复用的;假设每次显示一个view都要创建一个。是很耗费内存的。所以为了节约内存。能够在convertView不为null的时候。对其进行复用

    2、优化二:缓存item条目的引用——ViewHolder

        findViewById()这种方法是比較耗性能的操作,由于这种方法要找到指定的布局文件,进行不断地解析每一个节点:从最顶端的节点进行一层一层的解析查询,找到后在一层一层的返回,假设在左边没找到。就会接着解析右边。并进行对应的查询。直到找到位置(如图)。因此能够对findViewById进行优化处理,须要注意的是:

    》》》》特点:xml文件被解析的时候,仅仅要被创建出来了,其孩子的id就不会改变了。依据这个特点。能够将孩子id存入到指定的集合中,每次就能够直接取出集合中相应的元素就能够了。

    优化:

    在创建view对象的时候。降低布局文件转化成view对象的次数;即在创建view对象的时候,把所有孩子所有找到,并把孩子的引用给存起来

    ①定义存储控件引用的类ViewHolder

    这里的ViewHolder类须要不须要定义成static,依据实际情况而定,假设item不是非常多的话,能够使用,这样在初始化的时候。仅仅载入一次。能够略微得到一些优化

    只是,假设item过多的话。建议不要使用。由于static是Java中的一个keyword,当用它来修饰成员变量时,那么该变量就属于该类,而不是该类的实例。所以用static修饰的变量。它的生命周期是非常长的。假设用它来引用一些资源耗费过多的实例(比方Context的情况最多)。这时就要尽量避免使用了。

        class ViewHolder{

                          //定义item中对应的控件

                 }

    ②创建自己定义的类:ViewHolder holder = null;

    ③将子view加入到holder中:

    在创建新的listView的时候。创建新的ViewHolder。把所有孩子所有找到,并把孩子的引用给存起来

    通过view.setTag(holder)将引用设置到view中

    通过holder。将孩子view设置到此holder中。从而降低以后查询的次数

    ④在复用listView中的条目的时候。通过view.getTag(),将view对象转化为holder。即转化成对应的引用,方便在下次使用的时候存入集合。

      通过view.getTag(holder)获取引用(须要强转)

    二、ListView中数据的分批及分页载入:

    需求:ListView有一万条数据,怎样显示;假设将十万条数据载入到内存,非常消耗内存

    解决的方法:

    优化查询的数据:先获取几条数据显示到界面上

    进行分批处理---à优化了用户体验

    进行分页处理---à优化了内存空间

    说明:

    一般数据都是从数据库中获取的,实现分批(分页)载入数据,就须要在相应的DAO中有相应的分批(分页)获取数据的方法。如findPartDatas ()

    1、准备数据:

        在dao中加入分批载入数据的方法:findPartDatas ()

        在适配数据的时候,先载入第一批的数据,须要载入第二批的时候,设置监听检測何时载入第二批

    2、设置ListView的滚动监听器:setOnScrollListener(new OnScrollListener{….})

    ①、在监听器中有两个方法:滚动状态发生变化的方法(onScrollStateChanged)和listView被滚动时调用的方法(onScroll)

    ②、在滚动状态发生改变的方法中,有三种状态:

    手指按下移动的状态:                          SCROLL_STATE_TOUCH_SCROLL:// 触摸滑动

    惯性滚动(滑翔(flgin)状态):   SCROLL_STATE_FLING: // 滑翔

    精巧状态:                                          SCROLL_STATE_IDLE:// 精巧

    3、对不同的状态进行处理:

    分批载入数据,仅仅关心精巧状态:关心最后一个可见的条目,假设最后一个可见条目就是数据适配器(集合)里的最后一个。此时可载入很多其它的数据。在每次载入的时候,计算出滚动的数量,当滚动的数量大于等于总数量的时候。能够提示用户无很多其它数据了。

  • 相关阅读:
    在WCF中使用Flag Enumerations
    WCF开发教程资源收集
    [转]WCF 4 安全性和 WIF 简介
    Asp.Net Web API 2 官网菜鸟学习系列导航[持续更新中]
    Asp.Net Web API 2第十八课——Working with Entity Relations in OData
    Asp.Net Web API 2第十七课——Creating an OData Endpoint in ASP.NET Web API 2(OData终结点)
    Asp.Net Web API 2第十六课——Parameter Binding in ASP.NET Web API(参数绑定)
    Asp.Net Web API 2第十五课——Model Validation(模型验证)
    函数 生成器 生成器表达式
    函数的进阶
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6885777.html
Copyright © 2011-2022 走看看