You must not call setTag() on a view Glide is targeting的解決方案

概述

在使用Glide加載圖片時,若是出現「You must not call setTag() on a view Glide is targeting」的錯誤,八成是在使用ListView的時候出現的。簡單來講就是本來想簡化佈局文件的代碼,可是很不幸,這樣作卻會形成錯誤android

解決方案1

若是出錯了,你的item八成是這個樣子:ide

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/iv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
  • 1
  • 2
  • 3
  • 4
  • 5

使用Glide不會出錯的item佈局:佈局

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</FrameLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

只要在ImageView的外層再加一層父佈局,就不會有問題了(LinearLayout,RelativeLayout等均可以)spa

緣由分析

若是追蹤錯誤來源,會找到這裏:.net

@Override
public Request getRequest() {
    Object tag = getTag();
    Request request = null;
    if (tag != null) {
        if (tag instanceof Request) {
            request = (Request) tag;
        } else {
            throw new IllegalArgumentException("You must not call setTag() on a view Glide is targeting");
        }
    }
    return request;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

ImageView中的Tag須要強轉成Request。若是,item中只有ImageView,那麼在Adapter中:code

convertView.setTag(holder);
  • 1

這句代碼等同於:xml

imageview.setTag(holder);
  • 1

這樣的話,getTag()的對象就不爲Request,從而拋出異常。對象

那Glide爲啥要給ImageView設置Tag呢?緣由也很容易想到: 
Glide給ImageView設置Tag的緣由是爲了防止圖片加載錯亂blog

解決方案2

在評論區中,一葉飄舟指出了:使用RecyclerView,能夠避免該問題,即便佈局文件中的代碼爲下面的代碼,也不會出錯圖片

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/iv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
  • 1
  • 2
  • 3
  • 4
  • 5

結語

  1. 若是使用ListView,只需改變item的佈局就能夠解決問題,不要太糾結。
  2. 若是想要佈局簡潔,不用改變佈局文件,使用RecyclerView來代替ListView

轉載請標明出處:http://blog.csdn.net/qq_26411333/article/details/52034444

相關文章
相關標籤/搜索