我们有一个定制的基类,用于在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似乎会随机选择想要显示的图像吗?
提前致谢。
答案 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);