android Gridview position 0 重複加載

  不知道各位技術屌絲有沒有遇到這個問題,反正我是遇到了。並且還致使了第一張有時加載不出來的狀況。那必須解決唄。固然也不忘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。
相關文章
相關標籤/搜索