android Gridview position 0 重复加载

来源:互联网 发布:股票选股器软件下载 编辑:程序博客网 时间:2024/05/24 03:22

转载:http://my.oschina.net/u/559701/blog/110945

不知道各位技术屌丝有没有遇到这个问题,反正我是遇到了。而且还导致了第一张有时加载不出来的情况。那必须解决呗。当然也不忘google,baidu了一把,搜到的方案都没解决。也在这里鄙视那些自己连问题都没解决就胡乱转载别人的文章的人。

我先说说我的情况。

?
1
2
3
4
5
6
7
8
9
10
public View getView(final int position, View convertView, ViewGroup parent) {
        System.out.println("position<span></span>:"+ posi<span></span>tion);
         
        newThread(new Runnable() {
            @Override
            publicvoid run() {
                //加载position的数据,一般是图片啦。当然图片的加载一般也是异步加载啦
            }
        });
    }

打印出来日志会发现调用顺序是

?
1
2
3
4
5
6
7
8
02-2811:59:37.733: I/System.out(5669): position:0
02-2811:59:37.733: I/System.out(5669): position:0//真正的position 0
02-2811:59:37.733: I/System.out(5669): position:1
02-2811:59:37.733: I/System.out(5669): position:2
02-2811:59:37.733: I/System.out(5669): position:3
02-2811:59:37.733: I/System.out(5669): position:4
02-2811:59:37.733: I/System.out(5669): position:0
02-2811:59:37.733: I/System.out(5669): position:0

如果是倒着向上面刷,日志顺序为

?
1
2
3
4
5
6
7
8
9
10
11
02-2811:59:37.733: I/System.out(5669): position:6
02-2811:59:37.733: I/System.out(5669): position:7
02-2811:59:37.733: I/System.out(5669): position:8
02-2811:59:37.733: I/System.out(5669): position:3
02-2811:59:37.733: I/System.out(5669): position:4
02-2811:59:37.733: I/System.out(5669): position:5
02-2811:59:37.733: I/System.out(5669): position:0//真正的position 0
02-2811:59:37.733: I/System.out(5669): position:1
02-2811:59:37.733: I/System.out(5669): position:2
02-2811:59:37.733: I/System.out(5669): position:0
02-2811:59:37.733: I/System.out(5669): position:0

    position 0多次加载。网上很多人也说了这个问题。这是由于gridview不知道它里面到底能放多少item。因此多次加载position 0来适配。的确是这样。

    上面不是说我们加载图片是异步的嘛。所以在返回view的时候,是还没加载好图片的。我们往往在异步加载线程中会采用map<int,View>来关联position和控件的关系(异步加载完成后,才回调找到控件来显示图片)。那么多次调用position 0来加载图片的时候,如果加载到position:4后面的0时(或者是倒着回刷的position 2 后面的0时),图片在异步线程中还没加载出来,或还没有回调真正的position 0来显示的话。那么map<int,view>中真正的position 0就会被后面假的position 0覆盖,这样的话,就会导致第一张加载不出来。倒着回刷position 0也同样有这个问题。

问题原因找到了。下面是解决方案,网上有的人说是在getview中使用

parent.getChildCount() == position 则为真正调用,事实上,这样是不行的。

我想到的一个方案是,测试有效:

?
1
2
3
4
5
6
7
8
9
10
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。
0 0
原创粉丝点击