J'utilise Glide la vue interne de l'adaptateur personnalisé de la bibliothèque dans mes applications. Mais j'ai une erreur:
"You must not call setTag() on a view Glide is targeting"
Cette partie de mon code:
@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;
}
alors comment y remédier?
La clé est ViewTarget.setTagId
; sa définition libérera le setTag
par défaut sur le ImageView
afin que vous puissiez l'utiliser en tant que root dans la disposition de l'élément. Il a été introduit dans Glide 3.6.0 dans numéro # 37 .
Dans votre manifeste, ajoutez ceci:
<application
Android:name=".App"
Créez ensuite une classe de contexte d'application:
public class App extends Application {
@Override public void onCreate() {
super.onCreate();
ViewTarget.setTagId(R.id.glide_tag);
}
}
Ajoutez ce qui suit comme contenu pour src/main/values/ids.xml
:
<resources>
<item type="id" name="glide_tag" />
</resources>
(ou ajoutez simplement le <item ... />
ci-dessus dans n'importe quel resources
xml dans values
)
Mise à jour : ViewTarget
est déconseillé depuis 4.8.0. Si vous utilisez into(ImageView)
, vous devrez toujours appeler la méthode de la classe obsolète, car les classes *ViewTarget
Intégrées étendent toujours l'ancienne classe.
Si vous utilisez un ViewTarget
personnalisé, migrez vers CustomViewTarget
comme remplacement. Cela supprimera la nécessité de définir n'importe quel ID de balise, car le comportement par défaut de CustomViewTarget
utilise un ID spécifique à Glide, il ne doit donc pas entrer en conflit avec les appels setTag
. Si vous souhaitez malgré tout personnaliser l'ID, vous pouvez utiliser useTagId
sur votre cible personnalisée.
Glide
utilise la méthode setTag(Object)
en interne. Supprimez donc tous les appels de setTag(Object)
de votre vue cible. c'est-à-dire ImageView
Si vous avez vraiment besoin d'utiliser la méthode setTag
sur votre vue, vous pouvez utiliser la méthode setTag(int,Object)
à la place.
D'après ce que j'ai trouvé sur Google, Glide et ViewHolder semblent ne pas bien s'entendre. J'ai plutôt essayé Picasso. Problème résolu instantanément.
Vous pouvez également essayer la solution de TWiStErRob, mais assurez-vous que vous utilisez Glide 3.6.0 ou supérieur. Il n'a pas reconnu setTagId (int) sur 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.
}
}
});
Voir aussi: https://androidhiker.blogspot.com/2015/10/how-to-resolve-glide-settag-issue.html
J'ai eu le même problème, après avoir supprimé les éléments suivants
Android:tag="xx"
à partir de l'image sur ma disposition xml, ce problème avait disparu
Tel qu'écrit par Thu Thu
, vous pouvez simplement référencer un id
de tout View
existant. Par exemple, supposons que vous souhaitiez définir une balise sur un ImageView
:
image_view.setTag(R.id.image_view, 100)
if (image_view.getTag(R.id.image_view) == 100) ...
Si vous êtes libre d'utiliser une autre bibliothèque , utilisez, sinon vous pouvez utiliser setTag (int, Object) , mais si vous ne pouvez pas faire ci-dessus alors encapsuler ImageView dans un LinearLayout> setTag () de base sur LinearLayout> setOnClickListener sur LinearLayout.
Quelque chose comme :
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)
Remplacez onClick et:
@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
}
}
J'espère que cela t'aides.