問題現狀:Android ListView getView()方法重復調用導致position錯位
解決辦法:把ListView布局文件的layout_height屬性改為fill_parent或者match_parent.
<ListView
android:id="@+id/myphoto_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:dividerHeight="5px"
android:listSelector="@android:color/transparent" >
</ListView>
一下是原作者的解釋:(轉自:http://blog.csdn.net/f8376904110/article/details/6460934)
當我們在使用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設計的時候,才能很好的去結合!