I’m setting the background color of a row based on a text value of one of it’s children. However, multiple backgrounds are being set regardless of its text value. It gets worse when scrolling up and down. The code for the adapter:
package com.test.app;
import java.util.ArrayList;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MyBaseAdapter extends BaseAdapter {
private LayoutInflater mInflater = null;
private ArrayList<String[]> mItems = new ArrayList<String[]>();
public MyBaseAdapter(Context context, ArrayList<String[]> items) {
mItems = items;
mInflater = LayoutInflater.from(context);
}
public void addItem(String[] it) {
mItems.add(it);
}
public void setListItems(ArrayList<String[]> lit) {
mItems = lit;
}
@Override
public int getCount() {
return mItems.size();
}
@Override
public Object getItem(int position) {
return mItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
static class ViewHolder {
public TextView tv0,tv1;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View rowView = null;
ViewHolder viewHolder;
if(convertView == null)
{
rowView = mInflater.inflate(R.layout.history_row, null);
}
else
{
rowView = convertView;
}
viewHolder = new ViewHolder();
viewHolder.tv0 = (TextView)rowView.findViewById(R.id.textView0);
viewHolder.tv1 = (TextView)rowView.findViewById(R.id.textView1);
rowView.setTag(viewHolder);
ViewHolder holder = (ViewHolder) rowView.getTag();
holder.tv0.setText(mItems.get(position)[0].toString());
holder.tv1.setText(mItems.get(position)[1].toString());
if(holder.tv1.getText().equals("0"))
{
rowView.setBackgroundColor(0xAA777777);
// Only the row containing "0" should be colored, yet it colors multiple, random rows.
}
return rowView;
}
}
If you just use:
this will indeed make the row containing
0to have that particular color but as you will scroll the list up and down, this particular row with this color will get recycled and end up in places where it shouldn’t be. The correct way is to provide a default color to the row if it doesn’t contain0so you override the bad color of a possible recycled view:Also the correct code for the
ViewHolderpattern is:and then you use the
viewHolderobject to setup the row’s data.