当前位置: 代码迷 >> 综合 >> ListView getview()重复被调用
  详细解决方案

ListView getview()重复被调用

热度:84   发布时间:2023-12-17 21:56:10.0

重写的listviewadapter中,在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"/>



当我们在使用listview的时候。有时候自定义adapter的时候,是不是会发现在getview里打印日志的时候,重复调用很多次?有时候4次,有的严重甚至到10次。当我们在listview中移动的时候。每移动一列都会调用很多次,这样大大影响到效率!其实这和listview本身在android上的机制有关。下面我开始来介绍一下吧:

在布局,我们只有一个listview的时候。那好。我们把高设置成wrap_content的时候。在listview里加载几行看看。日志在getview里打印一下。是不是重复调用了?那这个办法就好弄了。把高设置成fill_parent就成了。这个时候发现日志还是重复调用?那就要看一下Listview的上一级而已的高是不是也是设置也fill_parent的,如果不是。请改动吧。如果是。。。那我还真没碰到重复调用的!因为测试好几次了!

如果我们在而已里不只一个Listview。一个复杂好看的布局可能有很多。listview在布局的某个地方。这个时候有时候运气不好。你会发现你调用了很多次getview。我测试的时候。最高230次。可想而知。这个速度是相当慢。而且每移动一次就是调用这么多次!对于这样的情况,在修改布局的时候,要考虑以下两点:

1.首先考虑需求布局和性能哪个更重要一点。

2.考虑listview周边哪个布局控件影响到了它!

如果在性能上没有太大影响,而需求要求必需是那样的布局。那就以布局为主。看看有没有别的方法来优化一下listview,当然前提是布局一点都不能调整。如果能调整,布局没有太大变动。而listview又能很好的优化。那就当然优化了!当我们优化的时候。首先要看一下有没有影响到Listview重绘的控件,比如。如果它上面和下面都有控件。而且高都是wrap_content,那么你就要设置成fill_parent或者固定高。这样listview在高上就不会重绘,这是最主要的一点。那左右是不是也有控件(一般一个手机页面用到list的时候不会有这么多控件)?有,那我们就也要调整,那就同高一样的设置。一定要让listview是一个固定在那个地方不动的。不然,你就等着让他重复去调用吧!

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



===========================================



我们知道listview的getview调用次数是和他的子view个数相关的,执行次数取决于你屏幕上能显示几个条目,比如你有100行 ,但是你一屏只能显示5行,那么启动程序的时候 系统调用5次getView方法。虽然当你下拉的时候会不断的调用getview,但是首次加载的时候getview调用次数是你手机一屏能显示的item个数。比如我这里有一个listview,测试的手机能一次显示7个item(如图)。

那么正常情况下首次加载的时候log应该是这样的:


09-19 10:01:50.533: I/jianghejie(22297): getview-postion=0
09-19 10:01:50.540: I/jianghejie(22297): getview-postion=1
09-19 10:01:50.595: I/jianghejie(22297): getview-postion=2
09-19 10:01:50.603: I/jianghejie(22297): getview-postion=3
09-19 10:01:50.619: I/jianghejie(22297): getview-postion=4
09-19 10:01:50.626: I/jianghejie(22297): getview-postion=5
09-19 10:01:50.642: I/jianghejie(22297): getview-postion=6


但是实际情况却不是这样,而是重复了数次,很明显这是异常现象,log如下:

09-19 10:21:35.251: I/jianghejie(23718): getview-postion=0
09-19 10:21:35.259: I/jianghejie(23718): getview-postion=1
09-19 10:21:35.259: I/jianghejie(23718): getview-postion=2
09-19 10:21:35.267: I/jianghejie(23718): getview-postion=3
09-19 10:21:35.275: I/jianghejie(23718): getview-postion=4
09-19 10:21:35.275: I/jianghejie(23718): getview-postion=5
09-19 10:21:35.283: I/jianghejie(23718): getview-postion=6
09-19 10:21:35.290: I/jianghejie(23718): getview-postion=0
09-19 10:21:35.290: I/jianghejie(23718): getview-postion=1
09-19 10:21:35.298: I/jianghejie(23718): getview-postion=2
09-19 10:21:35.298: I/jianghejie(23718): getview-postion=3
09-19 10:21:35.306: I/jianghejie(23718): getview-postion=4
09-19 10:21:35.314: I/jianghejie(23718): getview-postion=5
09-19 10:21:35.314: I/jianghejie(23718): getview-postion=6
09-19 10:21:35.431: I/jianghejie(23718): getview-postion=0
09-19 10:21:35.478: I/jianghejie(23718): getview-postion=1
09-19 10:21:35.486: I/jianghejie(23718): getview-postion=2
09-19 10:21:35.494: I/jianghejie(23718): getview-postion=3
09-19 10:21:35.494: I/jianghejie(23718): getview-postion=4
09-19 10:21:35.501: I/jianghejie(23718): getview-postion=5
09-19 10:21:35.509: I/jianghejie(23718): getview-postion=6
09-19 10:21:35.556: I/jianghejie(23718): getview-postion=0
09-19 10:21:35.564: I/jianghejie(23718): getview-postion=1
09-19 10:21:35.564: I/jianghejie(23718): getview-postion=2
09-19 10:21:35.572: I/jianghejie(23718): getview-postion=3
09-19 10:21:35.572: I/jianghejie(23718): getview-postion=4
09-19 10:21:35.580: I/jianghejie(23718): getview-postion=5
09-19 10:21:35.580: I/jianghejie(23718): getview-postion=6
09-19 10:21:35.587: I/jianghejie(23718): getview-postion=0
09-19 10:21:35.595: I/jianghejie(23718): getview-postion=1
09-19 10:21:35.603: I/jianghejie(23718): getview-postion=2
09-19 10:21:35.611: I/jianghejie(23718): getview-postion=3
09-19 10:21:35.619: I/jianghejie(23718): getview-postion=4
09-19 10:21:35.626: I/jianghejie(23718): getview-postion=5
09-19 10:21:35.634: I/jianghejie(23718): getview-postion=6
09-19 10:21:35.665: I/jianghejie(23718): getview-postion=0
09-19 10:21:35.673: I/jianghejie(23718): getview-postion=1
09-19 10:21:35.673: I/jianghejie(23718): getview-postion=2
09-19 10:21:35.681: I/jianghejie(23718): getview-postion=3
09-19 10:21:35.681: I/jianghejie(23718): getview-postion=4
09-19 10:21:35.681: I/jianghejie(23718): getview-postion=5
09-19 10:21:35.689: I/jianghejie(23718): getview-postion=6
09-19 10:21:35.689: I/jianghejie(23718): getview-postion=0
09-19 10:21:35.697: I/jianghejie(23718): getview-postion=1
09-19 10:21:35.697: I/jianghejie(23718): getview-postion=2
09-19 10:21:35.697: I/jianghejie(23718): getview-postion=3
09-19 10:21:35.705: I/jianghejie(23718): getview-postion=4
09-19 10:21:35.705: I/jianghejie(23718): getview-postion=5
09-19 10:21:35.712: I/jianghejie(23718): getview-postion=6


怎么会发生这样的情况呢,我仔细和之前写的一些listview对比,发现和以前的不同之处在布局上,以往我一般都是将listview的高度设置成fill_parent,而这次我是设为wrap_content,这样做的问题在于,ListView没有取到实际的高度,他还要根据计算才能确定,而每一次计算应该会触发listview的渲染,所以就会出现getview的调用次数跟正常情况相比多了好几倍。

所以在一般情况下,我建议把listiview在布局文件中的高度总是设置为:fill_parent(或者match_parent),这不仅仅是getview的调用次数问题,还涉及到布局的效率。


  相关解决方案