46

この問題があります-テスト目的で、受信したリストParseFileのいずれかに追加しました。ParseObjectその行にのみ表示する代わりに、4 ~ 5 行ごとに、場合によってはそれ以上、場合によってはそれ以下を表示します。リサイクルビューがこれに関係しているのではないかと思います。奇妙なことに、他のデータ (この例からは削除されています) は、position変数で正常に機能します。

@Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        if(parseList.get(position).get("logo") != null){
            ParseFile image = (ParseFile) parseList.get(position).get("logo");
            String url = image.getUrl();
            Glide.with(context)
                    .load(url)
                    .placeholder(R.drawable.piwo_48)
                    .transform(new CircleTransform(context))
                    .into(holder.imageView);


        }

    }
4

5 に答える 5

87

ここでの答えは間違っていますが、正しい軌道に乗っています。

Glide#clear()画像ドローアブルを null に設定するだけでなく、を呼び出す必要があります。を呼び出さない場合でもclear()、非同期ロードが順不同で完了すると、ビューのリサイクルの問題が発生する可能性があります。コードは次のようになります。

@Override 
public void onBindViewHolder(ViewHolder holder, int position) {
    if (parseList.get(position).get("logo") != null) {
        ParseFile image = (ParseFile) parseList.get(position).get("logo");
        String url = image.getUrl();
        Glide.with(context) 
                .load(url)
                .placeholder(R.drawable.piwo_48)
                .transform(new CircleTransform(context)) 
                .into(holder.imageView);
    } else {
        // make sure Glide doesn't load anything into this view until told otherwise
        Glide.with(context).clear(holder.imageView);
        // remove the placeholder (optional); read comments below
        holder.imageView.setImageDrawable(null);
    }
} 
于 2015-09-24T16:39:35.567 に答える
4

たぶん、あなたはこのようなことを試す必要があります

.signature(new StringSignature(String.valueOf(System.currentTimeMillis())))

サンプル :

Glide.with(context)
                .load(url)
                .placeholder(R.drawable.progress_animation)
                .crossFade()
                .signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
                .error(R.drawable.image_error_404)
                .into(iv);
于 2017-02-15T11:23:36.747 に答える
2

RecyclerView各行で、新しいデータでリサイクルされます。コードでは、そうでImageViewない場合にのみ設定し、それ以外の場合は何もしません。nullこの場合、null でない場合は、現在のオブジェクトをImageView表示していないため、古い画像が表示されます。overrideこれは、else 条件を追加ImageViewし、null/blank に設定することで修正できます。

@Override 
    public void onBindViewHolder(ViewHolder holder, int position) {
        if(parseList.get(position).get("logo") != null){
            ParseFile image = (ParseFile) parseList.get(position).get("logo");
            String url = image.getUrl();
            Glide.with(context) 
                    .load(url)
                    .placeholder(R.drawable.piwo_48)
                    .transform(new CircleTransform(context)) 
                    .into(holder.imageView);


        } 
        else{
            holder.imageView.setImageDrawable(null);
        }
    } 
于 2015-09-21T23:57:26.733 に答える
1

「ロゴ」が null の場合、画像をクリアする代わりに再利用された画像を取得します。次のコードを追加して、画像を適切にクリアします。

holder.imageView.setImageDrawable(null);
于 2015-09-21T23:57:05.400 に答える