我在来自我的recyclerview的每个视图中都有togglebuttons,我在我的Sqlite数据库中设置了一个数据,当我退出应用程序以在开始时恢复它时,它给我一个ToggleButton的状态。它工作正常:当我检查ToggleButton,离开应用程序并重新启动它时,ToggleButton具有与我离开应用程序时相同的状态。但问题是:当我检查ToggleButton时,向上滚动视图,向上滚动后,不再检查ToggleButton 但如果我退出应用程序并返回,则检查它。滚出时如何保存ToggleButton的状态?
我的onBindViewHolder中的代码:
holder.state.setText(item.getState());
holder.toggle.setChecked(false);
if(holder.state.getText().toString().equals("yes")) {
holder.toggle.setChecked(true);
holder.toggle.setBackgroundResource(R.drawable.trianglegreenup);
marks_string = holder.marks.getText().toString();
marksint = Integer.valueOf(marks_string);
marksint--;
marks_string = String.valueOf(marksint);
myDb.updateData(holder.id.getText().toString(), marks_string);
holder.marks.setText(marks_string);
} else {
holder.toggle.setChecked(false);
}
其中State只是sqlite数据库中的一个字符串,默认值为:“no”
我在MyViewHolder中的代码:
toggle =((ToggleButton) itemView.findViewById(R.id.toggleButton));
toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked ){
if (isChecked){
if(toggledown.isChecked()) {
toggledown.setChecked(false);
toggle.setChecked(false);
toggledown.setBackgroundResource(R.drawable.triangleblackdown);
myDb.updateData2(id.getText().toString(), "no");
} else {
toggle.setBackgroundResource(R.drawable.trianglegreenup);
marks_string = marks.getText().toString();
marksint = Integer.valueOf(marks_string);
marksint++;
marks_string = String.valueOf(marksint);
myDb.updateData(id.getText().toString(), marks_string);
marks.setText(marks_string);
myDb.updateData2(id.getText().toString(), "yes");
state.setText("yes");
}
} else {
toggle.setBackgroundResource(R.drawable.triangleblackup);
marks_string = marks.getText().toString();
marksint = Integer.valueOf(marks_string);
marksint--;
marks_string = String.valueOf(marksint);
myDb.updateData(id.getText().toString(), marks_string);
marks.setText(marks_string);
myDb.updateData2(id.getText().toString(), "no");
state_.setText("no");
}
}
});
其中“ToggleDown”是与Toggle相反的ToggleButton。
谢谢!
答案 0 :(得分:0)
假设您已经上下滚动,并且非常合理地,您的ViewHolder
正在重复使用。
现在让我们分析您的onBindViewHolder()
:
holder.toggle.setChecked(false); // This will result in `onCheckedChanged()` to be called
if(holder.state.getText().toString().equals("yes")) {
holder.toggle.setChecked(true); // This will result in `onCheckedChanged()` to be called
// some code here
} else {
holder.toggle.setChecked(false); // This will result in `onCheckedChanged()` to be called
}
因此,至少有两次您无意中调用了onCheckedChanged()
的{{1}}方法。 ViewHolder
正在被重复使用,当您第一次创建它时,您附加了ViewHolder
并且避开了它。
为了删除该听众,您必须知道CheckedChangeListener
实际上何时被回收,ViewHolder
确切地告诉您:
onViewRecycler(ViewHolder)
答案 1 :(得分:0)
我认为您在检查开关时没有更新模型。你只是在更新数据库。同样更新您的模型,您的代码将按预期工作。