每当回收 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);
}
}
我正在编写一个待办事项列表应用程序,特别是我希望复选框的值在每次更改时都存储在数据库中。
我通过在 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);
}
}