Estado de la casilla de verificación ListView Viewholder

Tengo algunos problemas con mi adaptador personalizado ListView (y su viewHolder recientemente implementado). Tengo un ListView con una casilla de verificación para cada elemento (nada nuevo aquí). El problema es que, si hay más de 9 elementos en mi lista, cuando marque la primera casilla de verificación, la décima se verificará automáticamente (igual para la segunda con la undécima), como si hubiera un oyente para ambas (y yo creo que es el caso de alguna manera).

Leí sobre el problema de posición con listView, ver reciclaje y la forma de ViewHolder para resolverlo aquí:¿Cómo puedo hacer que mi ArrayAdapter siga el patrón de ViewHolder?

Pero probablemente hice algo mal porque no está funcionando ...

public class PresenceListAdapter extends SimpleAdapter {
private LayoutInflater  inflater;
private List<Integer> ids;
private List<String> statuts;

public PresenceListAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to, List<Integer> ids, List<String> statuts)
{
    super (context, data, resource, from, to);
    inflater = LayoutInflater.from (context);
    this.ids = ids;
    this.statuts= statuts;

}

@Override
public Object getItem (int position)
{
    return super.getItem (position);
}

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

    ViewHolder holder;

    if (convertView == null)
    {
        convertView = inflater.inflate (R.layout.list_text_checkbox, null);

        holder = new ViewHolder();

        holder.btn = (Button) convertView.findViewById(R.id.btnRetard);
        holder.check = (CheckBox) convertView.findViewById(R.id.checkPresent);

        if (statuts.get(position).equals("P")) {
            Drawable img = inflater.getContext().getResources().getDrawable(android.R.drawable.presence_online);
            holder.btn.setCompoundDrawablesWithIntrinsicBounds( img, null, null, null );
            holder.btn.setEnabled(true);
            holder.check.setChecked(true);
        }
        else if(statuts.get(position).equals("R"))
        {
            Drawable img = inflater.getContext().getResources().getDrawable(android.R.drawable.presence_away);
            holder.btn.setCompoundDrawablesWithIntrinsicBounds( img, null, null, null );
            holder.btn.setEnabled(true);
            holder.check.setChecked(true);
        }
        else 
        {
            Drawable img = inflater.getContext().getResources().getDrawable(android.R.drawable.presence_invisible);
            holder.btn.setCompoundDrawablesWithIntrinsicBounds( img, null, null, null );
            holder.check.setChecked(false);
        }

        convertView.setTag(holder);
    }
    else 
    {
        holder = (ViewHolder) convertView.getTag();
    }

    int id = ids.get(position);

    if(id != 0)
    {
        holder.check.setTag(id);
        holder.btn.setTag(id);
    }

    return super.getView (position, convertView, parent);
}

static class ViewHolder {
    Button btn;
    CheckBox check;
}

Y mi interlocutor: public void changerPresent (View v) {

    CheckBox checkPresent = (CheckBox) v;
    int idPersonne = (Integer) checkPresent.getTag();
    View parent = (View)v.getParent();
    Button btn = (Button) parent.findViewById(R.id.btnRetard);

    if(checkPresent.isChecked()) {
        gestion.updatePresence(idPersonne, idSeance, "P");

        btn.setEnabled(true);
        setBtnRetardPresent(btn);           
    }
    else 
    {
        gestion.updatePresence(idPersonne, idSeance, "A");
        btn.setEnabled(false);
        setBtnRetardAbsent(btn);

    }

}

Agradecería cualquier ayuda en este momento, estoy trabajando en esto por horas.

Muchas gracias.

Respuestas a la pregunta(3)

Su respuesta a la pregunta