1

I am trying to change image in RecycleView dynamically. It will get changed successfully but when I scroll RecycleView ImageView will get change

Here is my adapter class code:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolders> {
    private List<ItemObject> itemList;
    private Context context;
    OnGridSelected onGridObj;
    public RecyclerViewAdapter(Context context, List<ItemObject> itemList,OnGridSelected onGridObj) {
        this.itemList = itemList;
        this.context = context;
        this.onGridObj = onGridObj;
    }
    @Override
    public RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int viewType) {
        View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view_list, null);
        RecyclerViewHolders rcv = new RecyclerViewHolders(layoutView,itemList,onGridObj);
        return rcv;
    }
    @Override
    public void onBindViewHolder(RecyclerViewHolders holder, int position) {
        if(!itemList.get(position).isSelected()) {
            holder.countryName.setText(itemList.get(position).getName());
            holder.countryPhoto.setImageResource(itemList.get(position).getPhoto());
            itemList.get(position).setIsSelected(true);
        }
    }
    @Override
    public int getItemCount() {
        return this.itemList.size();
    }
}

How do I prevent recycle view getting recycle?

Amy
  • 4,034
  • 1
  • 20
  • 34

2 Answers2

6

Please try this:

If you are using RecycyclerView,override only getItemViewType method.

@Override
public int getItemViewType(int position) {
    return position;
}
Satan Pandeya
  • 3,747
  • 4
  • 27
  • 53
Amit gupta
  • 107
  • 1
  • 3
1

Please change

@Override
public void onBindViewHolder(RecyclerViewHolders holder, int position) {
    if(!itemList.get(position).isSelected()) {
        holder.countryName.setText(itemList.get(position).getName());
        holder.countryPhoto.setImageResource(itemList.get(position).getPhoto());
        itemList.get(position).setIsSelected(true);
    }
}

to

@Override
public void onBindViewHolder(RecyclerViewHolders holder, int position) {
        holder.countryName.setText(itemList.get(position).getName());
         holder.countryPhoto.setImageResource(itemList.get(position).getPhoto());
    }
}

and if you really need isSelected flag please use this:-

@Override
public void onBindViewHolder(RecyclerViewHolders holder, int position) {
    if(!itemList.get(position).isSelected()) {
        holder.countryName.setText(itemList.get(position).getName());
        holder.countryPhoto.setImageResource(itemList.get(position).getPhoto());
        itemList.get(position).setIsSelected(true);
    }else {
// specify here what to do when is selected is true
}
}

as onBindViewHolder is called each time a view is shown on screen so if isSelected is true it will never go into if condition and so the old data will be visible as recyclerview reuses views so u should specify what should be done when isSelected is true so that recyclerview can bind data to it

JAAD
  • 12,349
  • 7
  • 36
  • 57