每当回收 viewHolder 时都会调用 onCheckedChanged

onCheckedChanged is called whenever viewHolder is recycled

我正在编写一个待办事项列表应用程序,特别是我希望复选框的值在每次更改时都存储在数据库中。

我通过在 onBindViewHolder

中添加 setOnCheckedChangeListener 来设置此功能
@Override
    public void onBindViewHolder(@NonNull TodosAdapter.TodoViewHolder holder, int position)
    {
        Todo todo = todoList.get(position);

        holder.todoTV.setText(todo.getText());
        holder.todoTV.setChecked(todo.isDone()); //isDone is a boolean that indicates whether the checkBox has been selected or not

        holder.todoTV.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                dbManager.allDao().setTodoIsDone(todo.getTodoId(), isChecked); //sets the isDone attribute of the database
                todo.setDone(isChecked);
            }
        });
    }

问题是当 viewHolder 被回收时 onCheckedChanged 也会被调用,在这些情况下它 returns isChecked = false;

我在这里找到了解决方案:Android setOnCheckedChangeListener calls again when old view comes back。 只需使用 buttonView.isShown() 方法:

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    if(buttonView.isShown()) {
        dbManager.allDao().setTodoIsDone(todo.getTodoId(), isChecked); //sets the isDone attribute of the database
        todo.setDone(isChecked);
    }
}