Android 快速滚动后,RecyclerView显示错误图像

Android 快速滚动后,RecyclerView显示错误图像,android,imageview,android-recyclerview,Android,Imageview,Android Recyclerview,在我的应用程序中,我正在将RecyclerView.Adapter与我的自定义Holder类一起使用。每个项目由几个文本视图和一个图像视图(图标)组成。问题是快速滚动后,RecyclerView显示错误的图像 例如: 因此,我的持有人是: public class CafeHolder extends RecyclerView.ViewHolder implements OnClickListener { TextView itemName, itemType, itemMarksCount

在我的应用程序中,我正在将
RecyclerView.Adapter
与我的自定义
Holder
类一起使用。每个项目由几个
文本视图
和一个
图像视图
(图标)组成。问题是快速滚动后,
RecyclerView
显示错误的图像

例如:

因此,我的持有人是:

public class CafeHolder extends RecyclerView.ViewHolder implements OnClickListener {
TextView itemName, itemType, itemMarksCount, itemCommentsCount, itemRating;
ImageView imgCafe;
ImageLoader imgLoader;
private Context context;
private int cafeId;

public CafeHolder(View view, Context context){
    super(view);
    this.context = context;
    itemName = (TextView) view.findViewById(R.id.tvCafeName);
    imgCafe = (ImageView) view.findViewById(R.id.imgCafe);
    itemType = (TextView) view.findViewById(R.id.tvCafeType);
    itemMarksCount = (TextView) view.findViewById(R.id.tvMarksCount);
    itemCommentsCount = (TextView) view.findViewById(R.id.tvCommentsCount);
    itemRating = (TextView) view.findViewById(R.id.tvRatingCount);
    imgLoader = new ImageLoader(context);
    view.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    Intent intent = new Intent(context, InfoActivity.class);
    intent.putExtra(CafeDomain.ID, cafeId);
    context.startActivity(intent);
}

public void setCafeId(int cafeId){
    this.cafeId = cafeId;
}
和我的RecyclerView.Adapter:

public class CafeAdapter extends RecyclerView.Adapter<CafeHolder> {
private Context context;
List<CafeDomain> listItems;

public CafeAdapter(List<CafeDomain> listItems, Context context) {
    this.listItems = listItems;
    this.context = context;
}

@Override
public CafeHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_cafe_item2, parent, false);
    CafeHolder vh = new CafeHolder(v, context);
    return vh;
}

@Override
public void onBindViewHolder(CafeHolder holder, int position) {
    CafeDomain dItem =  this.listItems.get(position);
    holder.imgCafe.setImageDrawable(null);
    holder.itemName.setText(dItem.getName());
    ArrayList<TypeDomain> types = dItem.getTypes();
    StringBuilder sbTypes = new StringBuilder();
    for (int i = 0; i < types.size(); i++){
      sbTypes.append(types.get(i).getName());
      if (i!=types.size()-1)
          sbTypes.append(", ");  
    }
    holder.itemType.setText(sbTypes.toString());
    if (!dItem.getIconUrl().isEmpty()){
        holder.imgLoader.DisplayImage(dItem.getIconUrl(), holder.imgCafe); //load image from cache or web
    }
    else{
        holder.imgCafe.setImageResource(R.drawable.icon200); //set default image
    }


    holder.itemMarksCount.setText(String.valueOf(dItem.getMarksCount()));
    holder.itemCommentsCount.setText(String.valueOf(dItem.getCommentsCount()));
    holder.itemRating.setText(String.valueOf(dItem.getRating()));
    holder.setCafeId(listItems.get(position).getId());
}

@Override
public int getItemCount() {
    return listItems.size();
}

}
正在工作,但两个图像仍然错误:(

更新:
问题只出现在磁盘中没有图像缓存的快速滚动列表时。当我们有缓存时,这里没有问题…

嗨,我想你的问题在这里:

 if (!dItem.getIconUrl().isEmpty()){
        holder.imgLoader.DisplayImage(dItem.getIconUrl(), holder.imgCafe); //load image from cache or web
    }
    else{
        holder.imgCafe.setImageResource(R.drawable.icon200); //set default image
    }
我可以为您提供两种可能有效的解决方案。首先,使用
TextUtils.isEmpty()

İ如果这不起作用,如果您可以为
空url
url加载失败设置图像可绘制,只需将其留给图像下载程序并使用以下代码即可:

holder.imgLoader.DisplayImage(dItem.getIconUrl(), holder.imgCafe); 

我建议你使用通用图像加载器来解决这类问题。!!好的,谢谢你的建议,我会试试的it@jankigadhiya我已经测试过了,这里也是一样…所以问题不在ImageLoader类中。但是!问题只是当你快速滚动列表而没有在磁盘中缓存图像时。当我们有缓存时,这里就没有问题了…dItem.getIconUr如果cafe没有图标,则l()返回空字符串(“”)。第二个解决方案修复了我的问题,现在我只需在ImageLoader类中添加简单的检查url。谢谢!我很高兴它对您有所帮助。
 if (!TextUtils.isEmpty(dItem.getIconUrl())){
        holder.imgLoader.DisplayImage(dItem.getIconUrl(), holder.imgCafe); 
    }
    else{
        holder.imgCafe.setImageResource(R.drawable.icon200); //set default image
    }
holder.imgLoader.DisplayImage(dItem.getIconUrl(), holder.imgCafe);