This question was answered here: Checking a checkbox in listview makes other random checkboxes checked too
Basically, when you scroll down you list, it recycles its present state as well as listeners attached to it.
One way I solved this problem is (suposing that your list is called check in java):
- Create a boolean array (let's name it listCheck), same size as your checkbox, all values false
- Write in your adapter - getViewmethod:
 - check.setChecked(listCheck[position]); //listCheck is your array of booleans.
check.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        CheckBox checkBox = (CheckBox) v.findViewById(R.id.checkEspecialidade);
        listCheck[position] = check.isChecked();
    }
});
 - Basically, we set the check value the same as the one on the array, and when the user clicks it, we also change de value of that check in the array. That works because the boolean array is not recycled.