不知道各位技術屌絲有沒有遇到這個問題,反正我是遇到了。並且還致使了第一張有時加載不出來的狀況。那必須解決唄。固然也不忘google,baidu了一把,搜到的方案都沒解決。也在這裏鄙視那些本身連問題都沒解決就胡亂轉載別人的文章的人。 java
我先說說個人狀況。 異步
public View getView(final int position, View convertView, ViewGroup parent) { System.out.println("position:" + position); new Thread(new Runnable() { @Override public void run() { //加載position的數據,通常是圖片啦。固然圖片的加載通常也是異步加載啦 } }); }
打印出來日誌會發現調用順序是 ide
02-28 11:59:37.733: I/System.out(5669): position:0 02-28 11:59:37.733: I/System.out(5669): position:0//真正的position 0 02-28 11:59:37.733: I/System.out(5669): position:1 02-28 11:59:37.733: I/System.out(5669): position:2 02-28 11:59:37.733: I/System.out(5669): position:3 02-28 11:59:37.733: I/System.out(5669): position:4 02-28 11:59:37.733: I/System.out(5669): position:0 02-28 11:59:37.733: I/System.out(5669): position:0
若是是倒着向上面刷,日誌順序爲 測試
02-28 11:59:37.733: I/System.out(5669): position:6 02-28 11:59:37.733: I/System.out(5669): position:7 02-28 11:59:37.733: I/System.out(5669): position:8 02-28 11:59:37.733: I/System.out(5669): position:3 02-28 11:59:37.733: I/System.out(5669): position:4 02-28 11:59:37.733: I/System.out(5669): position:5 02-28 11:59:37.733: I/System.out(5669): position:0//真正的position 0 02-28 11:59:37.733: I/System.out(5669): position:1 02-28 11:59:37.733: I/System.out(5669): position:2 02-28 11:59:37.733: I/System.out(5669): position:0 02-28 11:59:37.733: I/System.out(5669): position:0
position 0屢次加載。網上不少人也說了這個問題。這是因爲gridview不知道它裏面到底能放多少item。所以屢次加載position 0來適配。的確是這樣。 google
上面不是說咱們加載圖片是異步的嘛。因此在返回view的時候,是還沒加載好圖片的。咱們每每在異步加載線程中會採用map<int,View>來關聯position和控件的關係(異步加載完成後,纔回調找到控件來顯示圖片)。那麼屢次調用position 0來加載圖片的時候,若是加載到position:4後面的0時(或者是倒着回刷的position 2 後面的0時),圖片在異步線程中還沒加載出來,或尚未回調真正的position 0來顯示的話。那麼map<int,view>中真正的position 0就會被後面假的position 0覆蓋,這樣的話,就會致使第一張加載不出來。倒着回刷position 0也一樣有這個問題。 spa
問題緣由找到了。下面是解決方案,網上有的人說是在getview中使用 線程
parent.getChildCount() == position 則爲真正調用,事實上,這樣是不行的。 日誌
我想到的一個方案是,測試有效: code
public View getView(final int position, View convertView, ViewGroup parent) { if(position != 0){ //加載該position 的圖片 if(position == 1){ //加載該position 0 的圖片 } }else{ //將加載的控件等信息保存下來 } }總結來講,position 1以前加載的position 0必定是真正的。這樣的話,不管你的position 怎麼重複。你就能過濾掉假的position 0。