Проблема, с которой вы сталкиваетесь, связана с тем, как ListView
перерабатывает представления.
Вы, вероятно, уже знаете об этом, поскольку реализовали метод getView()
с учетом этого:
if(convertView == null){
// Inflate a new View
}
else{
// reuse the recylced view
}
Таким образом, ListView
отображает столько элементов, сколько необходимо для заполнения экрана. Он не создает больше элементов, пока вы не начнете прокручивать, а когда вы do начнете прокручивать, ListView
начнет повторно использовать уже раздутые представления, которые вышли из экрана.
Поэтому, когда вы прокручиваете вниз, представление для заметки 0 выходит за пределы экрана, и ListView
повторно использует его для заметки 9, которая вот-вот выйдет на экран.
Это привело бы к тому, что вы снова увидите «Мои заметки: 0» снизу, но ваш код уже решает эту проблему, заново устанавливая текст элемента соответствующим образом:
holder.name.setText(shopEntry.getName());
Но это все тот же объект View, который использовался для Note 0. Даже если вы обновили текст с правильным номером «9», состояние флажка остается таким же, как и для примечания 0, потому что это все тот же объект.
Чтобы решить эту проблему, вам нужно будет сделать 2 вещи:
- Хранить состояние «проверено» каждого элемента входа в магазин где-нибудь
- Inisde
getView()
, установить состояние флажка в состояние отмеченного т Запись в вопросе
Примерно так:
// Store a list of checked items. Update as items are checked/unchecked
private ArrayList<ShopEntry> checkedEntries = new ArrayList();
@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {
.
.
.
if(convertView == null){
LayoutInflater inflater = LayoutInflater.from(mContext);
convertView = inflater.inflate(mResource, parent, false);
holder= new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.textView_feedbackName);
holder.checkBox = convertView.findViewById(R.id.checkBox_shopEntry);
// Update the list of checked items when the user checks or unchecks an item
holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if(isChecked && !checkedEntries.contains(shopEntry)) {
checkedEntries.add(shopEntry);
} else {
checkedEntries.remove(shopEntry);
}
}
});
result = convertView;
convertView.setTag(holder);
}
else{
holder = (ViewHolder) convertView.getTag();
result = convertView;
}
.
.
.
holder.name.setText(shopEntry.getName());
// reset the checbkox state too!
holder.checkBox.setChecked(checkedEntries.contains(shopEntry));
return convertView;
}
Предупреждение: в системе не установлена Android Studio. Я пишу это, поэтому у меня нет не проверял этот код. Простите за это. Но я надеюсь, что передал общую идею. Возможно, вы захотите реализовать всю вещь «отслеживайте, какие элементы проверены» по-своему (лучше).