Это происходит потому, что когда вы просматриваете список, он фактически повторно использует строки для отображения информации. Это значительно улучшает производительность прокрутки по длинным спискам.
Но это в стороне, давайте исправьте его. То, что вам нужно сделать, это инициировать событие, когда флажок установлен, поэтому значение может быть сохранено в массиве, наиболее подходящим для остальной информации списка, чтобы при повторном просмотре значение можно было восстановить, а также как правильно очистить проверенное состояние при повторном использовании представления.
Это может быть сделано внутри метода getView() в вашем пользовательском ArrayAdapter.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if(row == null) {
LayoutInflater inflater = LayoutInflater.from(this.getContext());
row = inflater.inflate(R.layout.category_color, parent, false);
}
if(this.getCount() > position) {
DataObject data = this.getItem(position);
CheckBox checkbox = (CheckBox)row.findViewById(R.id.checkbox);
checkbox.setChecked(data.isChecked());
checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
data.setChecked(isChecked);
}});
...
}
return(row);
}
2 проблема возникает bcz android os автоматически переназначает состояние флажка, поэтому вам необходимо поддерживать состояния флажка в arraylist и явно переназначить его на bindView() методе –