hamzarh
hamzarh

Reputation: 330

Changing background color of one element of list view

Befor using the viewholder i was able to change the background of one element (that with te position == numEmission) of my listview but now each tiem i scroll the colored item change and i can have even 3 colored item, can any one help me.

public class ItemAdapterProgramme extends ArrayAdapter<Programme> {

public ArrayList<Programme> resultats;
public Bitmap bm;
public Context context;
public ImageLoader imageLoader = ImageLoader.getInstance();
public DisplayImageOptions options;
static ViewHolder holder;
public  LayoutInflater mInflater ;
public int numEmission;
public Calendar c;
public int cHour;
Typeface typeface_date, typeface_title;

public ItemAdapterProgramme(Context context, ArrayList<Programme> resultat) {
    super(context, R.layout.feed_view_programme, resultat);
    this.context = context;
    resultats = resultat;
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    typeface_date = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto/Roboto-Medium.ttf");
    typeface_title = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto/Roboto-Condensed.ttf");
}

public View getView(final int position, View convertView, final ViewGroup parent) {

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.feed_view_programme,parent, false);
        holder = new ViewHolder();
        holder.image = (ImageView) convertView.findViewById(R.id.prog_logo);
        holder.titre = (TextView) convertView.findViewById(R.id.prog_title);
        holder.animator = (TextView) convertView.findViewById(R.id.prog_anim);
        holder.start = (TextView) convertView.findViewById(R.id.prog_start);
        holder.end = (TextView) convertView.findViewById(R.id.prog_end);
        holder.description = (TextView) convertView.findViewById(R.id.prog_description);
        holder.animator.setTypeface(typeface_date);
        holder.titre.setTypeface(typeface_title);
        holder.start.setTypeface(typeface_title);
        holder.end.setTypeface(typeface_title);
        holder.description.setTypeface(typeface_title);
        holder.pb = (ProgressBar) convertView.findViewById(R.id.prog_progressBar1);
        holder.relativeLout_emission = (RelativeLayout)convertView.findViewById(R.id.layout_prog);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.titre.setText(resultats.get(position).getTitle());
    holder.animator.setText(resultats.get(position).getAnimateur());
    holder.start.setText("Début: "+resultats.get(position).getStart());
    holder.end.setText("    Fin: "+resultats.get(position).getEnd());
    holder.description.setText(resultats.get(position).getDescription());




    File cacheDir = StorageUtils.getOwnCacheDirectory(context, "UniversalImageLoader/Cache");

    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
    .denyCacheImageMultipleSizesInMemory()
    .offOutOfMemoryHandling()
    .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) 
    .discCache(new UnlimitedDiscCache(cacheDir))
    .discCacheFileNameGenerator(new HashCodeFileNameGenerator())
    .imageDownloader(new URLConnectionImageDownloader(5 * 1000, 20 * 1000)) 
    .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
    .enableLogging()
    .build();

    imageLoader.init(config);

    options = new DisplayImageOptions.Builder()
    .showStubImage(R.drawable.error)
    .showImageForEmptyUri(R.drawable.error)
    .cacheInMemory()
    .cacheOnDisc()
    .imageScaleType(ImageScaleType.IN_SAMPLE_INT)
    .build();

    imageLoader.displayImage(resultats.get(position).getImageUrl(),  holder.image, options, new ImageLoadingListener() {
        @Override
        public void onLoadingStarted() {
            holder.pb.setVisibility(View.VISIBLE);                  }
        @Override
        public void onLoadingFailed(FailReason failReason) {
            holder.pb.setVisibility(View.GONE);                 
        }
        @Override
        public void onLoadingComplete(Bitmap loadedImage) {
            holder.pb.setVisibility(View.GONE);                 
        }
        @Override
        public void onLoadingCancelled() {
            // Do nothing
        }
    });
    c = Calendar.getInstance();  
    cHour=c.get(Calendar.HOUR_OF_DAY);
    Log.d("Adapter cHour", cHour+"");
    numEmission=findEmission(cHour);
    Log.d("Adapter numEmission", numEmission+"");
    if(position==numEmission){
        holder.relativeLout_emission.setBackgroundColor(context.getResources().getColor(R.color.grey));
    }
    return convertView;
}

public int findEmission(int hour){
    for(int i=0;i < resultats.size()-1;i++){
        String start=resultats.get(i).getStart();
        String end=resultats.get(i).getEnd();
        String[] P0=start.split(":");
        String[] P1=end.split(":");
        start=P0[0];
        end=P1[0];
        int intStart=Integer.parseInt(start);
        int intEnd=Integer.parseInt(end);
        if(intStart<=hour && hour<=intEnd) {
            numEmission=i;
            break;
        }
    }
    return numEmission;
}

static class ViewHolder {
    TextView titre, animator, start, end, description;
    ImageView image;
    ProgressBar pb;
    RelativeLayout relativeLout_emission;
}

Upvotes: 2

Views: 1967

Answers (1)

vasart
vasart

Reputation: 6702

The problem is not in holder, but in convertView. ListView can use one convertView several times to increase perfomance. So if you colored item once, each time it is reused you will have one more colored item. You can remove holder and inflate new view each time, but it is not good to do so.

Try modifiying your code like this

if (position==numEmission) {
    holder.relativeLout_emission.setBackgroundColor(context.getResources().getColor(R.color.grey));
} else {
    // set default background color
    holder.relativeLout_emission.setBackgroundColor(context.getResources().getColor(R.color.default_list_element_background));
}

Upvotes: 7

Related Questions