如果绘制者视图从不调用 .setImageUri(uri),Fresco 从缓存中随机设置 uri

Fresco randomly set uri from cache if drawee view never call .setImageUri(uri)

我们有一个定制的基础 class 用于在 recyclerview 中创建单个单元格:

public abstract class RecyclerViewItem<T extends RecyclerViewAdapter.ViewHolder> implements RecyclerViewItemInterface<T> {

    @Override
    public int getTypeId() {
        return this.getClass().hashCode();
    }

    @Override
    public T createViewHolder(ViewGroup parent) {
        View v = LayoutInflater.from(parent.getContext()).inflate(getViewId(), parent, false);

        try {
            String className = ((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0].toString().split("\s")[1];
            return (T)Class.forName(className).getConstructor(this.getClass(), View.class).newInstance(this, v);
        } catch (Exception e) {
            throw new RuntimeException("please create a viewholder accepting view as arg");
        }
    }

    @Override
    public void populateViewHolder(SdRecyclerViewAdapter.ViewHolder holder) {
        onPopulateViewHolder((T) holder);
    }

    protected abstract int getViewId();

    protected abstract void onPopulateViewHolder(T holder);
}

接口:

public interface RecyclerViewItemInterface<T extends RecyclerViewAdapter.ViewHolder> {
    int getTypeId();
    T createViewHolder(ViewGroup parent);
    void populateViewHolder(RecyclerViewAdapter.ViewHolder holder);
}

此 class 的实现之一是使用 SimpleDraweeView 显示图像。我已经通过以下方式设置了占位符:

holder.iconButton.getHierarchy().setPlaceholderImage(R.drawable.no_photo);

如果此单元格有图像,则显示它:

mImageUrl = data.generateImageUrl();
if (mImageUrl != null) {
    holder.iconButton.setImageURI(Uri.parse(imageUrl));
}

这会正确显示具有图像的单元格的图像。但是如果一个单元格没有图像(mImageUrl null),它会随机显示另一个单元格的图像。 我知道我可以输入:

    if (mImageUrl != null) {
        holder.iconButton.setImageURI(Uri.parse(imageUrl));
    } else {
        holder.iconButton.setImageURI("res:/" + R.drawable.no_photo);
    }

如果我不调用 .setImageURI(),有人可以向我解释为什么 Fresco 似乎随机选择它想要显示的图像吗?

提前致谢。

我猜这是因为视图回收。 recycler 视图重新使用了一个现有的 DraweeView,它仍然具有之前图像集的 URL。 这就是为什么而不是

mImageUrl = data.generateImageUrl();
if (mImageUrl != null) {
    holder.iconButton.setImageURI(Uri.parse(mImageUrl));
}

你可以做到

mImageUrl = data.generateImageUrl();
holder.iconButton.setImageURI(mImageUrl != null ? Uri.parse(mImageUrl) : null);