错误"您不得在视图上调用setTag()Glide正在定位"使用Glide时

Ama*_*iam 38 android android-glide

我在我的应用程序中使用Glide库内部自定义适配器视图.但我有错误:

"You must not call setTag() on a view Glide is targeting" 
Run Code Online (Sandbox Code Playgroud)

这部分代码:

 @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;
    }
Run Code Online (Sandbox Code Playgroud)

那怎么解决呢?

TWi*_*Rob 69

关键是ViewTarget.setTagId; 设置它将释放默认值setTag,ImageView因此您可以在项目布局中以root身份使用它.它在问题#370中的Glide 3.6.0中引入.

在你的清单中添加:

<application
        android:name=".App"
Run Code Online (Sandbox Code Playgroud)

然后创建应用程序上下文类:

public class App extends Application {
    @Override public void onCreate() {
        super.onCreate();
        ViewTarget.setTagId(R.id.glide_tag);
    }
}
Run Code Online (Sandbox Code Playgroud)

添加以下内容作为src/main/values/ids.xml:

<resources>
    <item type="id" name="glide_tag" />
</resources>
Run Code Online (Sandbox Code Playgroud)

(或者只是将上面的内容添加<item ... />到任何resourcesxml中values)

  • @Elenasys它确实有效.刚试了一下.如果ImageView是来自第三方库的自定义视图,则调用setTag()有时是不可避免的. (4认同)
  • @Elenasys这种方法将Glide配置为与单个`ImageView`列表项兼容.我开了[#370](https://github.com/bumptech/glide/issues/370),这个问题导致在这个问题出现之前差不多一年就添加了`setTagId`方法,预计它可能会在以后出现.Glide必须以某种方式将请求与目标(视图)相关联,这就是它最初设计的方式,并且在大多数情况下都能很好地工作.其他时候,您可能需要一些配置,就像任何其他框架/库一样. (2认同)
  • @JasonStack非常简单,只需遵循该ID的位置以及调用`getRequest()`的位置即可。默认情况下,Glide将请求对象存储在视图的默认标记中。请注意,根据自定义ID的存在,setTag会有不同的重载。 (2认同)

P V*_*tak 17

GlidesetTag(Object)内部使用方法.因此,setTag(Object)从目标视图中删除所有调用.即ImageView

如果您确实需要setTag在视图上使用方法,则可以使用setTag(int,Object)方法.

  • 谢谢.如果使用任何整数常量作为第一个参数,您将收到一个异常:`java.lang.IllegalArgumentException:该键必须是特定于应用程序的资源ID.因此,请参阅接受的答案或/sf/ask/200170211/. (2认同)