Ошибка "Вы не должны вызывать 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;
}
так как это исправить?
6 ответов
Ключ 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
)
Glide
использование setTag(Object)
метод внутренне. Так что удалите все вызовы setTag(Object)
с вашей целевой точки зрения. т.е. ImageView
Если вам действительно нужно использовать setTag
Метод на ваш взгляд, вы можете использовать setTag(int,Object)
метод вместо.
Судя по тому, что я нашел в Google, похоже, что Glide и ViewHolder не слишком хорошо ладят друг с другом. Я попробовал Пикассо вместо этого. Проблема решена мгновенно.
Вы также можете попробовать решение из TWiStErRob, но убедитесь, что вы используете Glide 3.6.0 или выше. Он не распознал setTagId(int) на 3.5.2
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
У меня была такая же проблема, после удаления следующего
android:tag="xx"
из изображения на моем макете XML, эта проблема исчезла
Если у вас есть свобода использования другой библиотеки, используйте, иначе вы можете использовать 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
}
}
Надеюсь это поможет.
Как написано Thu Thu
Вы можете просто сослаться на id
любого существующего View
, Например, предположим, что вы хотите установить тег на ImageView
:
image_view.setTag(R.id.image_view, 100)
if (image_view.getTag(R.id.image_view) == 100) ...