2016-06-09 3 views
4

В моем приложении я использую RecyclerView.Adapter с моим обычным классом Holder. Каждый элемент состоит из нескольких TextView и одного ImageView (значок). Проблема в том, что RecyclerView показывает неправильное изображение после быстрой прокрутки.RecyclerView показывает неправильное изображение после быстрого прокрутки

Пример:

truth

NOT truth

Итак, мой держатель:

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(); 
} 

} 

я могу видеть, что этот код:

else{ 
     holder.imgCafe.setImageResource(R.drawable.icon200); //set default image 
    } 

работает, но два изображения неправильно все равно :(

UPDATE: Проблема только тогда, когда вы быстро прокрутки списка без кэша изображения в диске. Когда у нас есть кэш, нет никаких проблем здесь ...

+0

Я рекомендую использовать универсальный загрузчик изображений для этого типа проблем .. !! –

+0

ok Спасибо за совет, я попробую –

+0

@jankigadhiya Я тестировал, то же самое здесь ... Так что проблема не в классе ImageLoader. Но! Проблема заключается только в том, что вы быстро просматриваете список без кэширования изображений на диске. Когда у нас есть кеш, здесь нет проблем ... –

ответ

4

Привет я думаю, ваша проблема здесь:

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 
    } 

Я могу предложить вам два решения, которые могут работать. Сначала проверьте ваш ImageUrl является недействительным с TextUtils.isEmpty()

if (!TextUtils.isEmpty(dItem.getIconUrl())){ 
     holder.imgLoader.DisplayImage(dItem.getIconUrl(), holder.imgCafe); 
    } 
    else{ 
     holder.imgCafe.setImageResource(R.drawable.icon200); //set default image 
    } 

Если это не сработает, если вы можете установить рисуем изображение для empty url или url loading fail просто оставить его в загрузчик изображений и просто использовать код ниже:

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

dItem.getIconUrl() возвращает пустую строку (""), если в кафе нет значка. Второе решение зафиксировало мою проблему, теперь мне просто нужно добавить простой URL-адрес проверки в мой класс ImageLoader. Спасибо! –

+0

Я рад, что это вам помогло. – savepopulation

Смежные вопросы