Android 如何在具有共享首选项的回收器视图上保存复选框

Android 如何在具有共享首选项的回收器视图上保存复选框,android,checkbox,android-recyclerview,sharedpreferences,Android,Checkbox,Android Recyclerview,Sharedpreferences,我有一个recycler视图,在recycler视图的行中,我有一个带有5个复选框的文本。 我的问题是每次我选中一个复选框时,共享首选项都会将所有复选框保存在同一位置 (编辑)示例:我选中第一行的复选框#2,并选中其他行的所有其他复选框#2。在我回到片段之后 这是我的适配器代码 public class HabitosAdapter extends RecyclerView.Adapter<HabitosAdapter.MyViewHolder> { private List

我有一个recycler视图,在recycler视图的行中,我有一个带有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();
    }


}
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();
}

}
公共类HabitosAdapter扩展了RecyclerView.Adapter{
私人名单;
私人碎片;
私有上下文;
私有复选框[]复选框=新复选框[5];
公共类MyViewHolder扩展了RecyclerView.ViewHolder{
文本视图名称;
CardView习惯于CardView;
复选框CB1、CB2、CB3、CB4、CB5;
公共MyViewHolder(查看项目视图){
超级(项目视图);
nombre=(TextView)itemView.findViewById(R.id.nombreHabito);
habitosCardView=itemView.findViewById(R.id.habitos\u card\u视图);
CB1=(复选框)itemView.findViewById(R.id.CBdia1);
CB2=(复选框)itemView.findViewById(R.id.CBdia2);
CB3=(复选框)itemView.findViewById(R.id.CBdia3);
CB4=(复选框)itemView.findViewById(R.id.CBdia4);
CB5=(复选框)itemView.findViewById(R.id.CBdia5);
}
}
公共习惯用法适配器(上下文mContext、列表习惯用法列表){
this.mContext=mContext;
this.mHabitosList=习惯列表;
}
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
View itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.habitos\u list\u行,父项,false);
SharedReferences preferences=mContext.getSharedReferences(“项目名称”,android.content.Context.MODE\u PRIVATE);
boolean valueBoolean=preferences.getBoolean(“KEY”,false);
SharedReferences.Editor=首选项.edit();
编辑器.putBoolean(“键”,valueBoolean);
commit();
返回新的MyViewHolder(itemView);
}
public void onBindViewHolder(@NonNull final MyViewHolder holder,final int position){
holder.nombre.setText(mHabitosList.get(position.getNombre());
holder.CB1.setChecked(getFromSP(“CB1”));
setOnCheckedChangeListener(新的CompoundButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮复合按钮,布尔b){
saveInSp(“CB1”,b);
}
});
holder.CB2.setChecked(getFromSP(“CB2”));
holder.CB2.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
if(holder.CB2.isChecked()){
saveInSp(“CB2”,真实);
}否则{
saveInSp(“CB2”,假);
}
}
});
holder.CB3.setChecked(getFromSP(“CB3”));
setOnCheckedChangeListener(新的CompoundButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮复合按钮,布尔b){
saveInSp(“CB3”,b);
}
});
holder.CB4.setChecked(getFromSP(“CB4”));
setOnCheckedChangeListener(新的CompoundButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮复合按钮,布尔b){
saveInSp(“CB4”,b);
}
});
holder.CB5.setChecked(getFromSP(“CB5”));
setOnCheckedChangeListener(新的CompoundButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮复合按钮,布尔b){
saveInSp(“CB5”,b);
}
});
}
public int getItemCount(){
返回mHabitosList.size();
}
私有布尔getFromSP(字符串键){
SharedReferences preferences=mContext.getSharedReferences(“项目名称”,android.content.Context.MODE\u PRIVATE);
返回preferences.getBoolean(key,false);
}
私有void saveInSp(字符串键,布尔值){
SharedReferences preferences=mContext.getSharedReferences(“项目名称”,android.content.Context.MODE\u PRIVATE);
SharedReferences.Editor=首选项.edit();
编辑器.putBoolean(键,值);
commit();
}
}
如何仅保存选中的复选框?
我知道我只需要选中特定的复选框,而不是在所有复选框上设置一个侦听器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();
    }


}
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();
}

}
公共类FireInfoAdapter扩展了RecyclerView.Adapter{
私有列表项=新的ArrayList();
私人监听;
私有布尔isMyValueChecked;
公共FireInfoAdapter(列表项、侦听器){
这个项目=项目;
this.listener=listener;
}
@非空
@凌驾
公共FireInfoViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
View View=LayoutInflater.from(parent.getContext()).flate(R.layout.item\u fire\u base\u info,parent,false);
SharedReferences SharedReferences=view.getContext().getSharedReferences(“我的首选项”,Context.MODE\u PRIVATE);
isMyValueChecked=SharedReferences.getBoolean(“复选框”,false);
返回新的FireInfoViewHolder(视图);
}
@凌驾
public void onBindViewHolder(@NonNull FireInfoViewHolder,int位置){
持有人。绑定(项目。获取(位置));
holder.itemCheckbox.setOnClickListener(视图->{
SharedReferences SharedReferences=view.getContext().ge