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

为什么Tag要在Adapter里面设置

你们不觉得那个设置tag的有问题吗?在adapter里面设置了tag,去到ImageLoader里面又去判断是否对应? 你前一秒中刚为这个ImageView设置了tag“A”,去到那边又判断ImageView.getTag()是否等于“A”?

正在回答

1 回答

因为你在不断滑动ListView的过程中,View复用会导致你的列表出现错位的情况,所以会给ImageView设置一个Tag,mImageView.setTag(url)。也就是说这个url只能和mImageView匹配。

private Handler mMainHandler = new Handler(Looper.getMainLooper()) {
   @Override
   public void handleMessage(Message msg) {
       //对象开始传入主线程中,开始处理
       LoaderResult result = (LoaderResult) msg.obj;
       ImageView imageView = result.imageView;
       String url = (String) imageView.getTag();
       if (url.equals(result.url)) {
           imageView.setImageBitmap(result.bitmap);
       } else {
           Log.d("gy", "when set image bitmap, but url has changed!");
       }
   }
};


public void showImageByThreads(final ImageView imageView, final String urlString) {

   Runnable loadBitmapTask = new Runnable() {
       @Override
       public void run() {
           imageView.setTag(urlString);
           Bitmap bitmap = loadBitmap(urlString);
           if (bitmap != null) {
               //将对应的imageView,url,bitmap封装成一个对象,然后将对象传入Handler
               LoaderResult result = new LoaderResult(imageView, urlString, bitmap);
               mMainHandler.obtainMessage(MESSAGE_POST_RESULT, result).sendToTarget();

           }
       }
   };
   THREAD_POOL_EXECUTOR.execute(loadBitmapTask);
}

LoaderResult对象对应的ImageView, url, Bitmap。我在showImageByThreads方法中将该对象传入Handler,

问题就出在,你滑动的过程中中,有可能ImageView和url不对应了,所以需要判断下,

String url = ImageView.getTag(); // 这是和ImageView对应的url。我们之前设置的。

LoaderResult对象的url,是我们传递过去的。有可能这个会改变。

说了不是很清楚,但是意思,就是这样的。

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

丿M灬S灬N丨

你根本没说清,你也没理解对。 是convertView缓存机制 & 异步加载机制 两者共同导致的。
2016-08-21 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

为什么Tag要在Adapter里面设置

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