我在我的应用程序中使用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;
}
那怎么解决呢?
关键是ViewTarget.setTagId
;设置它将释放setTag
上的默认ImageView
,以便您可以在项目布局中以root身份使用它。它是在issue #370的Glide 3.6.0中引入的。
在你的清单中添加:
<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
中的任何values
xml中)
更新:ViewTarget
自4.8.0以来已被弃用。如果你正在使用into(ImageView)
,你仍然需要调用已弃用的类的方法,因为内置的*ViewTarget
类仍然扩展旧类。
如果您使用自定义ViewTarget
,请迁移到CustomViewTarget
作为替代品。这将消除设置任何标记ID的需要,因为CustomViewTarget
的默认行为是使用特定于Glide的ID,因此它不应与任何setTag
调用冲突。如果您想要自定义ID,可以在自定义目标上使用useTagId
。
Glide
内部使用setTag(Object)
方法。因此,从目标视图中删除所有setTag(Object)
调用。即ImageView
如果您确实需要在视图上使用setTag
方法,则可以使用setTag(int,Object)
方法。
从我从谷歌搜索中发现,看起来像Glide和ViewHolder并不太相处。我试过毕加索。问题立刻解决了。
您也可以尝试TWiStErRob的解决方案,但请确保您使用的是Glide 3.6.0或更高版本。它无法识别3.5.2上的setTagId(int)
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布局上的图像,这个问题消失了
正如Thu Thu
所写,您可以简单地引用任何现有id
的View
。例如,假设您要将标记设置为ImageView
:
image_view.setTag(R.id.image_view, 100)
if (image_view.getTag(R.id.image_view) == 100) ...
如果您可以自由使用其他库,请使用,否则您可以使用setTag(int,Object),但如果您不能在上面执行,则将LinearView包装在LinearLayout上的LinearLayout> setOnClickListener上的基本LinearLayout> setTag()中。
就像是 :
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
}
}
希望这可以帮助。