如何在recyclerview中滚动时保存togglebutton的状态?

时间:2017-04-26 15:52:52

标签: java android android-recyclerview togglebutton

我在来自我的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。

谢谢!

2 个答案:

答案 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)

我认为您在检查开关时没有更新模型。你只是在更新数据库。同样更新您的模型,您的代码将按预期工作。