Ваша ошибка заключается в записи идентификатора CheckBox, в то время как CheckBox повторно используется RecyclerView, т. Е. Тот же CheckBox используется для элемента 1, и когда элемент 1 прокручивается за пределы экрана и элемент 7 выходит на экран, тот же привязанный блок CheckBox к пункту 7.
Так что, если вы отметите пункт 1, а затем прокрутите и отметите пункт 7, в ваших флажках вы получите один и тот же идентификатор дважды.
Глядя на ваш код, эти коды не нужны:
public ArrayList<Info_Checkbox> checkboxes = new ArrayList<>();
private Info_Checkbox info_checkbox = new Info_Checkbox();
info_checkbox.setId(items.get(getAdapterPosition()).getId());
checkboxes.remove(info_checkbox);
info_checkbox.setId(items.get(getAdapterPosition()).getId());
checkboxes.add(info_checkbox);
Вы можете получить индексы проверенного элемента из массива, в котором записывается, какие элементы проверены (проверить истинные элементы в массиве):
public SparseBooleanArray array = new SparseBooleanArray();
Это даст вам полный проверенных предметов:
private String getCheckedItems() {
String category = "";
for (int i = 0; i < items.size(); i++) {
if (array.get(i, false))
category = category + String.valueOf(i) + ",";
}
Log.i("asfaf", category);
return category;
}