android - 如何在具有共享首选项的回收站视图上保存复选框
问题描述
我有一个回收器视图,在回收器视图的行内,我有一个带有 5 个复选框的文本。我的问题是每次我选中一个复选框时,共享首选项会将所有复选框保存在同一位置。
(编辑)示例:我选中了第一行的复选框#2,并且其他行的所有其他复选框#2都被选中。在我回到碎片之后。
这是我的适配器代码
public class HabitosAdapter extends RecyclerView.Adapter<HabitosAdapter.MyViewHolder> {
private List<Habitos> mHabitosList;
private Fragment mFragment;
private Context mContext;
private CheckBox[] checkBoxes = new CheckBox[5];
public class MyViewHolder extends RecyclerView.ViewHolder{
TextView nombre;
CardView habitosCardView;
CheckBox CB1, CB2, CB3, CB4, CB5 ;
public MyViewHolder(View itemView) {
super(itemView);
nombre = (TextView) itemView.findViewById(R.id.nombreHabito);
habitosCardView = itemView.findViewById(R.id.habitos_card_view);
CB1 = (CheckBox) itemView.findViewById(R.id.CBdia1);
CB2 = (CheckBox) itemView.findViewById(R.id.CBdia2);
CB3 = (CheckBox) itemView.findViewById(R.id.CBdia3);
CB4 = (CheckBox) itemView.findViewById(R.id.CBdia4);
CB5 = (CheckBox) itemView.findViewById(R.id.CBdia5);
}
}
public HabitosAdapter(Context mContext, List<Habitos> habitosList){
this.mContext = mContext;
this.mHabitosList = habitosList;
}
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.habitos_list_row, parent, false);
SharedPreferences preferences = mContext.getSharedPreferences("PROJECT_NAME", android.content.Context.MODE_PRIVATE);
boolean valueBoolean = preferences.getBoolean("KEY", false);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("KEY", valueBoolean);
editor.commit();
return new MyViewHolder(itemView);
}
public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position){
holder.nombre.setText(mHabitosList.get(position).getNombre());
holder.CB1.setChecked(getFromSP("CB1"));
holder.CB1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
saveInSp("CB1", b);
}
});
holder.CB2.setChecked(getFromSP("CB2"));
holder.CB2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(holder.CB2.isChecked()){
saveInSp("CB2", true);
} else{
saveInSp("CB2", false);
}
}
});
holder.CB3.setChecked(getFromSP("CB3"));
holder.CB3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
saveInSp("CB3", b);
}
});
holder.CB4.setChecked(getFromSP("CB4"));
holder.CB4.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
saveInSp("CB4", b);
}
});
holder.CB5.setChecked(getFromSP("CB5"));
holder.CB5.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
saveInSp("CB5",b);
}
});
}
public int getItemCount(){
return mHabitosList.size();
}
private boolean getFromSP(String key) {
SharedPreferences preferences = mContext.getSharedPreferences("PROJECT_NAME", android.content.Context.MODE_PRIVATE);
return preferences.getBoolean(key, false);
}
private void saveInSp(String key,boolean value){
SharedPreferences preferences = mContext.getSharedPreferences("PROJECT_NAME", android.content.Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean(key, value);
editor.commit();
}
}
如何仅保存已选中的复选框? 我知道我必须只获取已检查的特定 CheckBox,而不是在所有 CheckBoxes2 上设置侦听器,但我不知道该怎么做,我正在开发我的第一个应用程序,所以感谢您的耐心等待。
解决方案
编辑为最终答案
public class MainActivity extends AppCompatActivity {
CheckBox CB1, CB2, CB3, CB4, CB5 ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText courseTitleEditText = null;
CB1 = (CheckBox) findViewById(R.id.CBdia1);
CB2 = (CheckBox) findViewById(R.id.CBdia2);
CB3 = (CheckBox) findViewById(R.id.CBdia3);
CB4 = (CheckBox) findViewById(R.id.CBdia4);
CB5 = (CheckBox) findViewById(R.id.CBdia5);
SharedPreferences preferences = getSharedPreferences("PROJECT_NAME", android.content.Context.MODE_PRIVATE);
boolean valueBoolean = preferences.getBoolean("KEY", false);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("KEY", valueBoolean);
editor.commit();
CB1.setChecked(getFromSP("CB1"+position));
CB1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
saveInSp("CB1"+position, b);
}
});
CB2.setChecked(getFromSP("CB2"+position));
CB2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(CB2.isChecked()){
saveInSp("CB2"+position, true);
} else{
saveInSp("CB2"+position, false);
}
}
});
CB3.setChecked(getFromSP("CB3"+position));
CB3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
saveInSp("CB3"+position, b);
}
});
CB4.setChecked(getFromSP("CB4"+position));
CB4.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
saveInSp("CB4"+position, b);
}
});
CB5.setChecked(getFromSP("CB5"+position));
CB5.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
saveInSp("CB5"+position,b);
}
});
}
private boolean getFromSP(String key) {
SharedPreferences preferences = getSharedPreferences("PROJECT_NAME", android.content.Context.MODE_PRIVATE);
return preferences.getBoolean(key, false);
}
private void saveInSp(String key,boolean value){
SharedPreferences preferences = getSharedPreferences("PROJECT_NAME", android.content.Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean(key, value);
editor.commit();
}
}
推荐阅读
- android - 是否可以在 Android Studio 中创建可翻译的任意 XML 资源?
- python - 按优先级对 Python 字典进行排序
- php - 使用 nginx 反向代理服务非静态 laravel 文件
- java - 用 Java Regex 匹配前面没有百分号的字母字符
- python - 在 Arch Linux 上使用 geckodriver(0.24.0) 运行 selenium(3.141.0) 时无法找到一组匹配的功能
- java - ItextRender 未在 pdf 中显示 xhtml 内容
- reactjs - 需要帮助在 JSX 中设置条件
- jquery - 为什么我的切换开关不会在点击时改变状态?
- wpf - 如何在用户控件中绑定命令?
- java - 相对 Xpath 在 Maven TestNg 中不起作用,但绝对路径有效