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、对不同的状态进行处理:

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

  • 相关阅读:
    Java设计模式——单例模式
    关于 "static" 关键字的那点事
    安卓 修改系统时间
    android sdk 5.0下载步骤
    Android开发中调用系统窗口的方法
    Eclipse 导入已有工程时.classpath和.project文件拒绝访 ...
    Android开发错误总结
    CursorIndexOutOfBoundsException
    html移动端适配方案rem
    pc端和移动端的viewport 以及 像素的含义
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6885776.html
Copyright © 2011-2022 走看看