android listview 连续调用 getview问题分析及解决

    [size=medium;]android listview 连续调用 getview问题分析及解决[/size]
 
转载自: http://blog.csdn.net/f8376904110/article/details/6460934
 
 
 
[size=medium;]       当我们在使用listview的时候。有时候自定义adapter的时候,是不是会发现在getview里打印日志的时候,重复调用很多次?有时候4次。有的严重甚至到10次,当我们在listview中移动的时候。每移动一列都会调用很多次,这样大大影响到效率!其实这和listview本身在android上的机制有关。下面我开始来介绍一下吧:[/size]
[size=medium;]<br>[/size]
[size=medium;]</span>
[size=medium;]      在布局,我们只有一个listview的时候。那好。我们把高设置成wrap_content的时候。在listview里加载几行看看。日志在getview里打印一下。是不是重复调用了?那这个办法就好弄了。把高设置成fill_parent就成了。这个时候发现日志还是重复调用?那就要看一下listview的上一级而已的高是不是也是设置也fill_parent的,如果不是。请改动吧。如果是。。。那我还真没碰到重复调用的!因为测试好几次了![/size]
[size=medium;]<br>[/size]
[size=medium;][/size]
[size=medium;]     如果我们在而已里不只一个listview。一个复杂好看的布局可能有很多。listview在布局的某个地方。这个时候有时候运气不好。你会发现你调用了很多次getview。我测试的时候。最高230次。。。可想而知。这个速度是相当慢。而且每移动一次就是调用这么多次!对于这样的情况,在修改布局的时候,要考虑以下两点:1.首先考虑需求布局和性能哪个更重要一点。2.考虑listview周边哪个布局控件影响到了它![/size]
[size=medium;]<br>[/size]
[size=medium;][/size]
[size=medium;]     如果在性能上没有太大影响,而需求要求必需是那样的布局。那就以布局为主。看看有没有别的方法来优化一下listview,当然前提是布局一点都不能调整。如果能调整,布局没有太大变动。而listview又能很好的优化。那就当然优化了!当我们优化的时候。首先要看一下有没有影响到listview重绘的控件,比如。如果它上面和下面都有控件。而且高都是wrap_content,那么你就要设置成fill_parent或者固定高。这样listview在高上就不会重绘,这是最主要的一点。那左右是不是也有控件(一般一个手机页面用到list的时候不会有这么多控件)?有,那我们就也要调整,那就同高一样的设置。一定要让listview是一个固定在那个地方不动的。不然,你就等着让他重复去调用吧![/size]
[size=medium;]<br>[/size]
[size=medium;][/size]
[size=medium;]     其实说了这么多。最主要的还是在我们进行布局的时候。要巧妙的运用每个控件的属性,以及了解控件每个的原理。这样在我们进行ui设计的时候,才能很好的去结合![/size]
 
<span style="color: #008000; font-size: large;"><br>[/size]
<span style="color: #008000; font-size: large;">关于adapter的getview方法中创建view的原理</span>
 
[size=small;]position的确是要显示的view在你的adapter里面的位置<br>你自己心里有一种先入为主的东西,扰乱了你的思维。<br>当你在滚动屏幕的时候,并不是说你只滚了一行,就只会有一次调用getview,实际上可能出现多次调用getview的(系统完全有可能多生成几行view,以便在摸动的时候,达到平滑不滞后的效果)。<br>在getview里面,你只能创建view,不可有自己的与界面无关的逻辑,因为你不知道getview什么时候被调用,以什么参数被调用。<br><br>而你要创建view,position参数是必须要使用的,所以不要怀疑这个参数。[/size][size=small;]<br>另外,position绝对不是屏幕上的位置,而是数据在adapter里面的位置,因为你创建view的时候,与它在屏幕上的位置没有关系,你只是创建,至于显示到哪里,你并没有做控制。<br>这个 先要理解了他的工作原理 才好分析原因。[/size]
[size=small;]<br>如果你的屏幕只能显示6行,所以position 的值就是0~5。<br>比如滚屏造成有一行出了屏,有一行新的入了屏<br>这个时候 新得到的view的 position 就会又充0计算<br>比如有2行进入的屏幕 那么position 就是0~1了<br>所以打印就是 先打印0~5 然后你拖地打印0~1<br>总之,position绝对是一个合法的值,但你不要想当然的认为,某次getview,一定会传一个position等于多少值的给你,不一定。因为getview是回调用的,什么时候创建是由系统决定的(它很可能会提早创建,原因前面我说过了)。<br><br>[/size][size=small;]<br>比如滚屏造成有一行出了屏,有一行新的入了屏,那么,系统会将出了屏的view做为参数(注意getview的第二个参数)调用getview,期望你将出屏的view改造成入屏的view(这只需要更新一下界面显示即可,不需要再new view,这就是我在前面某一贴里面跟你说的了——优化),如果每次都new,是很不负责的。<br>当然,上面只优化策略的一种,不排除还有其它策略,这要看google怎么设计的了。<br>比如滚屏造成有一行出了屏,有一行新的入了屏<br>这个时候 新得到的view的 position 就会又充0计算<br>比如有2行进入的屏幕 那么position 就是0~1了<br>所以打印就是 先打印0~5 然后你拖地打印0~1[/size]
 
 

你可能感兴趣的:(java,工作)