由于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:"
+ position);
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
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