ListView 性能优化

在使用listview的时候。自定义adapter,发现在getView里打印日志的时候,重复调用很多次?有时候 4次, 有时候10次,当我们在listview中移动的时候。每移动一列都会调用很多次,这样大大影响到效率!

重写的listview adapter中,在getView()方法中,打印语句时,相同的position打印了多次,修改方法:
将布局文件中ListView的高度改为“fill_parent”
 <ListView
   android:id="@+id/dynamic_list"
   android:layout_height="fill_parent"
   android:layout_width="fill_parent"
   android:scrollbars="vertical"
   android:layout_weight="1"
   android:drawSelectorOnTop="false"    
   android:fadingEdgeLength="0dip"  
   android:divider="@null" 
   android:dividerHeight="0dip"
   android:cacheColorHint="#00000000" 
   android:background="@color/listview_bg_color" />




      把高设成wrap_content的时候。在listview里加载几行。日志在 getview里打印一下。是不是重复调用了?把高设置成fill_parent就成了。这个时候发现日志还是重复调用?那就要看一下Listview的上一级布局的高是不是也是fill_parent的,如果不是。请改动吧。


     如果我们在布局里不止一个Listview。一个复杂好看的布局可能有很多。listview在布局的某个地方, 你会发现你调用了很多次getview, 这个速度是相当慢。对于这样的情况,在修改布局的 时候,要考虑以下两点:1.首先考虑需求布局和性能哪个更重要一点。2.考虑listview周边哪个布局控件影响到了它!


     当我们优化的时候。首先要看一下有没有影响到Listview重绘的控件,比如。如果它上面和下面都有控件。而且高都是wrap_content,那么你就要设置成fill_parent或者固定高。这样 listview在高上就不会重绘,这是最主要的一点。那左右是不是也有控件有,那我们就也要调整,那就同高一样的设置。一定要让listview是一个固定在那个地方不动的。


     其实说了这么多。最主要的还是在我们进行布局的时候。要巧妙的运用每个控件的属性,以及了解控件每个的原理。这样在我们进行UI设计的时候,才能很好的去结合!


关于Adapter的getView方法中创建view的原理


position的确是要显示的View在你的adapter里面的位置
你自己心里有一种先入为主的东西,扰乱了你的思维。
当你在滚动屏幕的时候,并不是说你只滚了一行,就只会有一次调用getView,实际上可能出现多次调用getView的(系统完全有可能多生成几行View,以便在摸动的时候,达到平滑不滞后的效果)。
在getView里面,你只能创建View,不可有自己的与界面无关的逻辑,因为你不知道getView什么时候被调用,以什么参数被调用。


而你要创建View,position参数是必须要使用的,所以不要怀疑这个参数。 
另外,position绝对不是屏幕上的位置,而是数据在adapter里面的位置,因为你创建View的时候,与它在屏幕上的位置没有关系,你只是创建,至于显示到哪里,你并没有做控制。
这个 先要理解了他的工作原理 才好分析原因。




如果你的屏幕只能显示6行,所以position 的值就是0~5。
比如滚屏造成有一行出了屏,有一行新的入了屏
这个时候 新得到的view的 position 就会又充0计算
比如有2行进入的屏幕 那么position 就是0~1了
所以打印就是 先打印0~5 然后你拖地打印0~1
总之,position绝对是一个合法的值,但你不要想当然的认为,某次getView,一定会传一个position等于多少值的给你,不一定。因为getView是回调用的,什么时候创建是由系统决定的(它很可能会提早创建,原因前面我说过了)。




比如滚屏造成有一行出了屏,有一行新的入了屏,那么,系统会将出了屏的View做为参数(注意getView的第二个参数)调用getView,期望你将 出屏的View改造成入屏的View(这只需要更新一下界面显示即可,不需要再new View,这就是我在前面某一贴里面跟你说的了——优化),如果每次都new,是很不负责的。
当然,上面只优化策略的一种,不排除还有其它策略,这要看google怎么设计的了。
比如滚屏造成有一行出了屏,有一行新的入了屏
这个时候 新得到的view的 position 就会又充0计算
比如有2行进入的屏幕 那么position 就是0~1了
所以打印就是 先打印0~5 然后你拖地打印0~1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值