Android ListView – Fixing Background Color Change When Scrolling

androidandroid-listview

My ListView contains two Textviews. In one row first one is for name and second one is for result. I need to change the background color of the result TextView according to the result. Like if pass then the result TextView color will be green when fails result TextView color will be red.I have ten rows in my ListView. I have tried like this

    @Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    ViewHolder holder;
    if(convertView==null)
    {
        holder = new ViewHolder();
        convertView = inflater.inflate(R.layout.items, null);

        holder.imgViewLogo = (ImageView) convertView.findViewById(R.id.imgViewLogo);
        holder.txtViewTitle = (TextView) convertView.findViewById(R.id.txtViewTitle);
        holder.txtViewDescription = (TextView) convertView.findViewById(R.id.txtViewDescription);
        holder.txtholder = (TextView) convertView.findViewById(R.id.holder1);
        holder.img = (ImageView)  convertView.findViewById(R.id.temperrr);
        convertView.setTag(holder);
    }
    else
        holder=(ViewHolder)convertView.getTag();

    ItemBean bean = (ItemBean) itemList.get(position);

    holder.imgViewLogo.setImageResource(bean.getImage());
    holder.txtViewTitle.setText(bean.getTitle());
    holder.txtViewDescription.setText(bean.getDescription());
  //------------------  
    if (position==0)
    {
        if(GridviewAdapter.glu>=81)
        {
        holder.img.setImageResource(R.drawable.red_arrow);
        holder.txtViewDescription.setBackgroundResource(R.color.resultred);  
        holder.txtholder.setBackgroundResource(R.color.resultred);  
        }
        else if (GridviewAdapter.glu==79||GridviewAdapter.glu==80)
        {
            holder.img.setImageResource(R.drawable.orange_arrow);
            holder.txtViewDescription.setBackgroundResource(R.color.resultoren);  
            holder.txtholder.setBackgroundResource(R.color.resultoren);  
        }
        else
        {
            holder.img.setImageResource(R.drawable.resultarrawnocolor);
            holder.txtViewDescription.setBackgroundResource(0);  
            holder.txtholder.setBackgroundResource(0);  
        }

    }
        holder.img.setImageResource(R.drawable.resultarrawnocolor);
       return convertView;
}

But, when scrolling the list the another random items's background color changing.what I have to do .? How can I control the items at each position in the listview . The above code is for just for the first row. am I right?

Best Answer

I think it is because list view recycles the view hence causing such problems .Try the following :

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = null;
        convertView = null;
        row = convertView;

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) _context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.row, parent,
                    false);
                       // your code 


          }
     return row;
}

Since convert view and row view both are intialized as null .Hence rows will be inflated every time and preventing recycling of views .

Link: Listview android recycling This links explains the mechanism of recycling views.

  • use the above code if wrong views are changing color.
  • if you are trying to say on touching views while scrolling background becomes black then use the following in list view

android:cacheColorHint="#00000000"

Related Question