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

时间:2016-09-21 08:39:38

标签: android android-recyclerview fresco

我们有一个定制的基类,用于在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);
}

该类的一个实现是使用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似乎会随机选择想要显示的图像吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

我猜这是因为视图回收。 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);