アプリで Glide library inner custom adapter viewを使用します。しかし、私はエラーがあります:
"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
が解放されるため、アイテムレイアウトのルートとして使用できます。 issue#37 で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に追加するだけです)
Update:ViewTarget
は4.8.0以降廃止されました。 into(ImageView)
を使用している場合、組み込みの_*ViewTarget
_クラスはまだ古いクラスを拡張するため、非推奨のクラスのメソッドを呼び出す必要があります。
カスタムViewTarget
を使用する場合は、代わりにCustomViewTarget
に移行します。 CustomViewTarget
のデフォルトの動作はGlide固有のIDを使用しているため、タグIDを設定する必要がなくなります。したがって、setTag
呼び出しと衝突することはありません。とにかくIDをカスタマイズする場合は、カスタムターゲットでuseTagId
を使用できます。
Glide
は内部でsetTag(Object)
メソッドを使用します。したがって、ターゲットビューからsetTag(Object)
のすべての呼び出しを削除してください。すなわちImageView
ビューでsetTag
メソッドを本当に使用する必要がある場合は、代わりにsetTag(int,Object)
メソッドを使用できます。
私がグーグルから見つけたものから、グライドと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)、しかし上でできない場合 ImageViewをLinearLayoutの基本的なLinearLayout> setTag()> LinearLayoutのsetOnClickListenerにラップします。
何かのようなもの :
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
}
}
お役に立てれば。