不知道各位技术屌丝有没有遇到这个问题,反正我是遇到了。并且还致使了第一张有时加载不出来的状况。那必须解决呗。固然也不忘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。