为了账号安全,请及时绑定邮箱和手机立即绑定

CommonViewHolder中设置使用Glide设置ImageView报错java.lang.IllegalArgumentException: You must not call setTag() on a view Glide is targeting

代码是在鸿洋老师的CommonAdapter的基础上写的,今天想把Glide引入项目中出现了自己处理不了的错误: 代码结构和调用是: public class GlideImageTestAct extends AppCompatActivity {        .......       gv.setAdapter(new CommonAdapter(this,datas,R.layout.simple_imageview_layout) {           @Override           public void convert(CommonViewHolder holder, String s) {               holder.setImageURI(R.id.iv,s);           }        });        ....... } public class CommonViewHolder {        .......        public CommonViewHolder setImageURI(int resId, String url) {           if (TextUtils.isEmpty(url)) return this;            ImageView imageView = getView(resId); Glide.with(mContext).load(url).centerCrop().placeholder(R.mipmap.default_image).error(R.mipmap.error_image).crossFade().into(imageView);         return this;          }        ....... } 运行报错:    E/AndroidRuntime: java.lang.IllegalArgumentException: You must not call setTag() on a view Glide is targeting

正在回答

3 回答

有个简单的方法,不要让ImageView成为根布局就可以了。这样子就不会有Tag的相冲问题。

0 回复 有任何疑惑可以回复我~

nice 解决了问题

0 回复 有任何疑惑可以回复我~

经过一天的研究问题已经解决:

        解决方式:

                将原CommonViewHolder中:

                        public CommonViewHolder(Context mContext, int position, ViewGroup parent,int layoutId)                         {
                               。。。。。。
                               mConvertView.setTag(this);
                        }

                        public static CommonViewHolder get(Context mContext, View convertView,
                                 。。。。。。
                               CommonViewHolder holder = (CommonViewHolder) convertView.getTag();
                                。。。。。。
                        }

                改为:       

                        public CommonViewHolder(Context mContext, int position, ViewGroup parent,int layoutId) 

                        {
                               。。。。。。
                               mConvertView.setTag(R.string.app_name,this);
                        }

                        public static CommonViewHolder get(Context mContext, View convertView,
                                 。。。。。。
                        CommonViewHolder holder = (CommonViewHolder)             convertView.getTag(R.string.app_name);
                                。。。。。。
                        }

        分析原因:

            个人理解是因为我们在CommonViewHolder中的

                public CommonViewHolder setImageURI(int resId, String url) {     

                   。。。。。。。                                         Glide.with(mContext).load(url).centerCrop().placeholder(R.mipmap.default_image)

        .error(R.mipmap.error_image).crossFade().into(imageView);
                  。。。。。。
                }

            使用的Glide加载图片的源码中也使用了setTag和getTag模式而,与CommonViewHolder中所用的Tag符号发生了重复冲突,所以我们应运用setTag(int,Object)的方法设置Tag以避免重复(注:setTag此处的第一个参数必须是资源文件的生成的int符,如果任意填写一个int数字则会报错)。

 ps:上面属于个人理解,如有错误欢迎指正。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Android-打造万能适配器
  • 参与学习       34701    人
  • 解答问题       107    个

本课程通过对传统的ListView数据绑定写法,打造万能适配器

进入课程

CommonViewHolder中设置使用Glide设置ImageView报错java.lang.IllegalArgumentException: You must not call setTag() on a view Glide is targeting

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信