由于gridview或者listview position==0时重复加载第一个item的图片加载失败的解决方案

由于gridview或者listview  position==0时重复加载getview导致Universal image loader的displayImage重复调用,导致onLoadingCancelled被调用,gridview/listview的第一项的图片加载失败,大致原因是:

知道各位技术屌丝有没有遇到这个问题,反正我是遇到了。而且还导致了第一张有时加载不出来的情况。那必须解决呗。当然也不忘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);
         
         new Thread( new Runnable() {
             @Override
             public void run() {
                 //加载position的数据,一般是图片啦。当然图片的加载一般也是异步加载啦
             }
         });
     }

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

?
1
2
3
4
5
6
7
8
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

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

?
1
2
3
4
5
6
7
8
9
10
11
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来适配。的确是这样

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

解决方案:

if (position == 0 && modeDto.isHasFirstLoaded()) {
                return convertView;
            }

if (position == 0) {
                modeDto.setHasFirstLoaded(true);
            }

..................(加载图片代码)在adapter类里添加个bean类:

class ModeDto {
        private boolean hasFirstLoaded = false;

        public boolean isHasFirstLoaded() {
            return hasFirstLoaded;
        }

        public void setHasFirstLoaded(boolean hasFirstLoaded) {
            this.hasFirstLoaded = hasFirstLoaded;
        }

    }

这样就能过滤掉多余的position==0

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值