Подтвердить что ты не робот

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

так, как это исправить?

4b9b3361

Ответ 1

Ключ является 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)

Обновление: ViewTarget устарела с 4.8.0. Если вы используете into(ImageView), вам все равно придется вызывать устаревший метод класса, потому что встроенные классы *ViewTarget прежнему расширяют старый класс.

Если вы используете пользовательский ViewTarget, CustomViewTarget на CustomViewTarget в качестве замены. Это CustomViewTarget от необходимости устанавливать любой идентификатор тега, поскольку в поведении по умолчанию для CustomViewTarget используется идентификатор, специфичный для Glide, поэтому он не должен конфликтовать ни с какими вызовами setTag. Если вы хотите настроить идентификатор в любом случае, вы можете использовать useTagId для своей цели.

Ответ 2

Glide использовать метод setTag(Object) внутри. Поэтому удалите все вызовы setTag(Object) из целевого представления. т.е. ImageView

Если вам действительно необходимо использовать метод setTag в своем представлении, вы можете вместо этого использовать метод setTag(int,Object).

Ответ 3

Из того, что я нашел из Googling, похоже, что Glide и ViewHolder не слишком ладят. Вместо этого я попробовал Пикассо. Проблема решена мгновенно.

Вы также можете попробовать решение от TWiStErRob, но убедитесь, что используете Glide 3.6.0 или выше. Он не распознал setTagId (int) на 3.5.2

Ответ 4

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

Ответ 5

У меня была такая же проблема, после удаления следующего

android:tag="xx"

из изображения на моем макете XML, эта проблема исчезла

Ответ 6

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

image_view.setTag(R.id.image_view, 100)
if (image_view.getTag(R.id.image_view) == 100) ...

Ответ 7

Если у вас есть свобода использования другой библиотеки, используйте, иначе вы можете использовать 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
        }
    }

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

Ответ 8

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