如果绘制者视图从不调用 .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);
我们有一个定制的基础 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);