为了账号安全,请及时绑定邮箱和手机立即绑定

mImageView.getTag().equals(mUrl)不是恒成立的吗

写上去也没什么用啊

谁来解释下

正在回答

3 回答

楼上没说到点子上。这是【同时】使用ConvertView和异步机制造成的。一个屏幕一次显示8个item,当第9个item划进屏幕时,ListView对adapter说,返给我一个view,我要显示。adapter调用getView()方法,由于使用了缓存机制,getView()在初始化8个item以后所有返回的view(ConvertView)内存地址都是这8个中的。如果【不使用】异步机制加载图片,那么返回的这个ConvertView是被更新以后返给ListView使用的。效果是上滑屏幕没反应,等了半天,突然加载出来,但是不会闪。然而这里使用了异步机制,也就是说先返回ConvertView,再等异步线程修改,这是闪的本质!由于教程里使每个异步线程人工阻塞了1s,那么上来有8个异步线程在运行(编号1-8),如果1s之内下滑了ListView比如说下滑了8个,那么新更新的8个item还是用的以前的内存,【并且】又开启了8个异步线程(编号9-16)。因为预先设定了一个默认图片,所以先显示绿色的默认icon图片。然后1-8号异步线程运行完毕,更新ImageView(闪),紧跟着9-16异步线程运行完毕,又更新imageView(闪)。最终显示正确结果。这就是下滑时先显示默认图片,再闪一下错误图片,最后闪一下正确图片的本质过程。如果给每个ImageView设置了tag以后,当1-8号异步线程运行完毕后,会发消息给handler,让他进行更新ui的操作,可是在1-8号线程发消息之前,9-16号线程已经更新了1-8和9-16共用的ImageView控件的tag,所以1-8号线程的消息虽然发给了handler,但是不满足条件,handler不会进行ui更新。

2 回复 有任何疑惑可以回复我~
#1

丿M灬S灬N丨

理解到位,讲述到位`
2016-08-21 回复 有任何疑惑可以回复我~
#2

jsbintask22

兄弟,学了多久了
2016-09-14 回复 有任何疑惑可以回复我~

我建议你们做个实验,ListView中的item加一个checkbox控件。

1、假设item有20条。当前页面能够显示的只有15条,也是剩下的5条,在不滑动的情况下,是看不到的。

2、当你选中第一条item的时候,再往下滑动。你会发现第16条的item也是被选中。而你根本没有点击过。

3、这是什么原因操作的,这是因为adapter在复用的时候造成。其实当第一条item不可见的时候,已经被第16条item复用了,第一条和第十六条item的区别就是里面的参数值。而第十六条item的其实是原封不动的第一条item。

4、以上表达的意思是视频中出现的图片问题的一种,滑动的时候,图片会跳动先显示一张,然后才显示正确的。

5、至于说setTag和getTag的问题,子线程,它不是顺序的,可能先执行的后加载完,后执行的先加载完,那就不是图片跳动的问题,那就是错乱的问题。什么意思呢,假如你第一个item通过异步方法获取图片然后setImageView。其实在多个线程的情况下,得到的bitmap不一定就是对应的那个bitmap。可能第一个item显示的是第三个的图片。

6、http://blog.csdn.net/lmj623565791/article/details/24333277 这里有分析adpterView 复用的问题。

2 回复 有任何疑惑可以回复我~
#1

sadfqjvoa

说的很好~之前我就在listview里加了checkbox,就发现点了一个,往后滑动,看到好几个也选中了,现在看到这个回答终于明白了
2016-02-18 回复 有任何疑惑可以回复我~
#2

丿M灬S灬N丨

根本没说到点子上。
2016-08-21 回复 有任何疑惑可以回复我~

android有可能导致两个值不一样

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Android必学-异步加载
  • 参与学习       50627    人
  • 解答问题       311    个

了解Android中的异步加载处理方法,这是面试问的最多的知识点

进入课程

mImageView.getTag().equals(mUrl)不是恒成立的吗

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信