Ошибка "Вы не должны вызывать setTag() в представлении Glide нацеливается" при использовании Glide
Я использую Glide внутренний пользовательский адаптер в моих приложениях. Но у меня есть ошибка:
"You must not call setTag() on a view Glide is targeting"
Эта часть моего кода:
@Override
public View getView(int position, View view, ViewGroup container) {
ViewHolder holder;
if (view == null) {
holder = new ViewHolder();
view = holder.imageView = new ImageView(context);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
holder.imageView.setAdjustViewBounds(true);
LinearLayout.LayoutParams vp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
holder.imageView .setLayoutParams(vp);
holder.imageView .setScaleType(ImageView.ScaleType.CENTER_CROP);
String var_news_article_images = imageIdList.get(getPosition(position));
Glide.with(context)
.load(var_news_article_images)
.placeholder(R.drawable.placeholder)
.into(holder.imageView);
return view;
}
так, как это исправить?
Ответы
Ответ 1
Ключ является ViewTarget.setTagId
; его установка освободит setTag
по умолчанию в ImageView
так что вы можете использовать его как root в макете элемента. Он был представлен в Glide 3.6.0 в выпуске № 370.
В вашем манифесте добавьте это:
<application
android:name=".App"
Затем создайте класс контекста приложения:
public class App extends Application {
@Override public void onCreate() {
super.onCreate();
ViewTarget.setTagId(R.id.glide_tag);
}
}
Добавьте следующее как содержимое для src/main/values/ids.xml
:
<resources>
<item type="id" name="glide_tag" />
</resources>
(или просто добавьте вышеуказанный <item.../>
в любые resources
XML в values
)
Обновление: ViewTarget
устарела с 4.8.0. Если вы используете into(ImageView)
, вам все равно придется вызывать устаревший метод класса, потому что встроенные классы *ViewTarget
прежнему расширяют старый класс.
Если вы используете пользовательский ViewTarget
, CustomViewTarget
на CustomViewTarget
в качестве замены. Это CustomViewTarget
от необходимости устанавливать любой идентификатор тега, поскольку в поведении по умолчанию для CustomViewTarget
используется идентификатор, специфичный для Glide, поэтому он не должен конфликтовать ни с какими вызовами setTag
. Если вы хотите настроить идентификатор в любом случае, вы можете использовать useTagId
для своей цели.
Ответ 2
Glide
использовать метод setTag(Object)
внутри. Поэтому удалите все вызовы setTag(Object)
из целевого представления. т.е. ImageView
Если вам действительно необходимо использовать метод setTag
в своем представлении, вы можете вместо этого использовать метод setTag(int,Object)
.
Ответ 3
Из того, что я нашел из Googling, похоже, что Glide и ViewHolder не слишком ладят. Вместо этого я попробовал Пикассо. Проблема решена мгновенно.
Вы также можете попробовать решение от TWiStErRob, но убедитесь, что используете Glide 3.6.0 или выше. Он не распознал setTagId (int) на 3.5.2
Ответ 4
ImageView mImageAds = (ImageView) findViewById(R.id.iv_img);
mImageAds.setTag(R.id.iv_img, i); // "i" means some integer value
Glide.with(getActivity()).load(urlPath)
.placeholder(R.drawable.ads_banner)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(mImageAds);
mImageAds.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if(mImageAds.getTag() != null) {
int position = (Integer) view.getTag(R.id.iv_img);
//code here what would you like to do.
}
}
});
Смотрите также: https://androidhiker.blogspot.com/2015/10/how-to-resolve-glide-settag-issue.html
Ответ 5
У меня была такая же проблема, после удаления следующего
android:tag="xx"
из изображения на моем макете XML, эта проблема исчезла
Ответ 6
Как написано Thu Thu
, вы можете просто ссылаться на id
любого существующего View
. Например, предположим, что вы хотите установить тег для ImageView
:
image_view.setTag(R.id.image_view, 100)
if (image_view.getTag(R.id.image_view) == 100) ...
Ответ 7
Если у вас есть свобода использования другой библиотеки, используйте, иначе вы можете использовать setTag (int, Object), но если вы не можете сделать выше, оберните ImageView в базовый LinearLayout> setTag() на LinearLayout> setOnClickListener на LinearLayout.
Что-то вроде:
LinearLayout imgViewLinearLayout = new LinearLayout(context);
imgViewLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
imgViewLinearLayout.setId(R.id.dummy_image_layout);
imgViewLinearLayout.setOnClickListener(this);
ImageView imageView = new ImageView(inflater.getContext());
imageView.setPadding(0,15,20,0);
imageView.setId(R.id.imageview_for_glide);
imgViewLinearLayout.setTag("Image VIEWTAG");
imgViewLinearLayout.addView(imageView)
Переопределить onClick и:
@Override
public void onClick(View v) {
if(v.getId() == R.id.dummy_image_layout){
//Do what you wanna wanted to do on click of ImageView
}
}
Надеюсь это поможет.
Ответ 8
Используйте view.setTage(int, object); и view.getTag(int);