niestandardowy ListView z polami wyboru sprawdzającymi niezaznaczone elementy

Mam BaseAdapter dla mojego ListView wewnątrz fragmentu, który wygląda tak:

public class SelectionMucListAdapter extends BaseAdapter {

    private LayoutInflater inflater = null;
    Typeface titleFace;
    ArrayList<UsersData> innerList = new ArrayList<UsersData>();

    public SelectionMucListAdapter(ArrayList<UsersData> users) {
        inflater = (LayoutInflater) mainActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        titleFace = Typeface.createFromAsset(mainActivity.getAssets(), "fonts/bradybun.ttf");
        innerList = users;
    }

    @Override
    public int getCount() {
        return innerList.size();
    }

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

    @Override
    public long getItemId(int id) {
        return id;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.muc_list_item, null);
            viewHolder = new ViewHolder();
            viewHolder.image = (ImageView)convertView.findViewById(R.id.item_image);
            viewHolder.check = (CheckBox)convertView.findViewById(R.id.cb_choose_user);
            viewHolder.title = (TextView)convertView.findViewById(R.id.item_text_1);
            viewHolder.rating=(RatingBar)convertView.findViewById(R.id.item_text_2);
            convertView.setTag(viewHolder);

        }else{
            viewHolder = (ViewHolder)convertView.getTag();
        }         

        viewHolder.title.setTypeface(titleFace);

        Bitmap avatar = innerList.get(position).getUserAvatar();//UsersManager.getInstance().getUsers().get(position).getUserAvatar();

        if(avatar != null)
            viewHolder.image.setImageBitmap(avatar);

        viewHolder.title.setText(innerList.get(position).getUserName());
        viewHolder.rating.setRating((float)Double.parseDouble(innerList.get(position).getRating()));
        viewHolder.check.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton cb, boolean isChecked) {
                if(cb.isChecked()) {// if this item is checked then add to list
                    Log.v("CheckBox", "pos: "+position+" checked");
                    if(!choices.contains(innerList.get(position))) {
                        choices.add(innerList.get(position));
                    }
                } else {// if its unchecked then remove from list if exist
                    Log.v("CheckBox", "pos: "+position+" checked");
                    if(choices.contains(innerList.get(position))) {
                        choices.remove(innerList.get(position));
                    }
                }
                isChecked = cb.isChecked();
            }
        });
        viewHolder.check.setTag(position);

        return convertView;
    }
}

static class ViewHolder{
    ImageView image;
    CheckBox check;
    TextView title;
    RatingBar rating;
}

class CheckState{
    boolean isChecked;
    UsersData usersData;

    public UsersData getUsersData() {
        return usersData;
    }

    public void setUsersData(UsersData usersData) {
        this.usersData = usersData;
    }

    public boolean isChecked() {
        return isChecked;
    }

    public void setChecked(boolean isChecked) {
        this.isChecked = isChecked;
    }

}

Mam 20 elementów listy, a problem polega na tym, że gdy sprawdziłem pierwsze 2 elementy, na przykład indeks [0] i [1], jakoś sprawdziłem automatycznie inne elementy w indeksie [9] i [10], gdy przewijam w dół lista. ten sam przypadek miał miejsce, gdy sprawdzałem inne elementy i sprawdzałem wielokrotnie z tym samym wzorem za każdym razem, gdy przewijam listę.

właściwie nie wiem, co się dzieje, więc chcę zapytać, czy ktoś tutaj może powstrzymać ten bałagan. Dziękuję Ci!

questionAnswers(5)

yourAnswerToTheQuestion