Ошибка "Вы не должны вызывать 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
        }
    }

Надеюсь это поможет.

Используйте view.setTage(int, object); и view.getTag(int);

Как написано Thu ThuВы можете просто сослаться на id любого существующего View, Например, предположим, что вы хотите установить тег на ImageView:

image_view.setTag(R.id.image_view, 100)
if (image_view.getTag(R.id.image_view) == 100) ...
Другие вопросы по тегам