首页 > 解决方案 > 如何在具有共享首选项的回收站视图上保存复选框

问题描述

我有一个回收器视图,在回收器视图的行内,我有一个带有 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 上设置侦听器,但我不知道该怎么做,我正在开发我的第一个应用程序,所以感谢您的耐心等待。

标签: androidcheckboxandroid-recyclerviewsharedpreferences

解决方案


编辑为最终答案

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

}

推荐阅读