Java 如何使用按钮单击保存多个复选框的状态

Java 如何使用按钮单击保存多个复选框的状态,java,checkbox,android-recyclerview,Java,Checkbox,Android Recyclerview,在我的应用程序中,我有一个ArrayList的recyclerView,其中我在文本视图旁边设置了一个复选框。我想通过单击按钮保存复选框的状态,并将其加载到另一个活动中,所有这些都应该通过共享引用来完成 事实上,我没有意识到如何通过单击按钮保存SharedPrevennces中复选框的状态 注意:请记住我是乞丐 下面是显示我所做操作的代码 public class StudentListActivity extends AppCompatActivity { private static fin

在我的应用程序中,我有一个
ArrayList
recyclerView
,其中我在文本视图旁边设置了一个
复选框。我想通过单击按钮保存
复选框的状态,并将其加载到另一个活动中,所有这些都应该通过
共享引用来完成

事实上,我没有意识到如何通过单击按钮保存
SharedPrevennces
复选框的状态

注意:请记住我是乞丐

下面是显示我所做操作的代码

public class StudentListActivity extends AppCompatActivity {
private static final String DATETIME = "dateTime";
private RecyclerView recyclerView;
private RecyclerView.Adapter rAdapter;
private RecyclerView.LayoutManager layoutManager;
ArrayList<ListOfNames> listOfNames;


SharedPreferences sharedPreferences;
SharedPreferences.Editor editor;

String t1 = "10";
String t2 = "100%";
Bundle bundle;
String subName;
Toolbar toolbar;
boolean[] items;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.student_list);

    toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    bundle = getIntent().getExtras();
    subName = bundle.getString("Subject Name");
    if (bundle != null) {
        getSupportActionBar().setTitle(subName);
    }
    loadData();


    Calendar calendar = Calendar.getInstance();
    String currentDate = DateFormat.getDateTimeInstance().format(calendar.getTime());


    toolbar.setSubtitle(currentDate);
    fabButton();
    buildRecyclerView();


}

@Override
public void onBackPressed() {
    super.onBackPressed();
    Intent intent = new Intent(this, ScrollingActivity.class);
    intent.putExtra("count", listOfNames.size());
    startActivity(intent);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()) {
        case R.id.changeDateTime:
            handleDate();

            return true;
        case R.id.pastAttendances:
            Intent intent = new Intent(this, PastAttendences.class);

            intent.putExtra("Title", subName);
            sharedPreferences = getSharedPreferences("MY_PREF", MODE_PRIVATE);
            editor = sharedPreferences.edit();

            String result = sharedPreferences.getString(DATETIME, null);



            intent.putExtra("key", result);

            editor.remove(DATETIME);
            editor.apply();
            startActivity(intent);

            return true;

        case R.id.saveButton:

            final String toolbarDateTime = toolbar.getSubtitle().toString();

            sharedPreferences = getSharedPreferences("MY_PREF", MODE_PRIVATE);
            editor = sharedPreferences.edit();
            editor.putString(DATETIME, toolbarDateTime);
            editor.apply();


            return true;
    }

    return super.onOptionsItemSelected(item);
}

public void handelTime(final CharSequence charSequence) {

    final Calendar calendar = Calendar.getInstance();

    int Hour = calendar.get(Calendar.HOUR);
    int Minute = calendar.get(Calendar.MINUTE);

    boolean is24Hour = android.text.format.DateFormat.is24HourFormat(this);

    TimePickerDialog timePickerDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker view, int Hour, int Minute) {


            Calendar calendar1 = Calendar.getInstance();

            calendar1.set(Calendar.HOUR, Hour);
            calendar1.set(Calendar.MINUTE, Minute);

            CharSequence charSequence1 = android.text.format.DateFormat.format("HH:mm:ss a", calendar1);
            toolbar.setSubtitle(charSequence + " " + charSequence1);
        }
    }, Hour, Minute, is24Hour);
    timePickerDialog.show();
}

public void handleDate() {

    final Calendar calendar = Calendar.getInstance();

    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int date = calendar.get(Calendar.DATE);

    DatePickerDialog datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker view, int year, int month, int date) {


            Calendar calendar1 = Calendar.getInstance();

            calendar1.set(Calendar.YEAR, year);
            calendar1.set(Calendar.MONTH, month);
            calendar1.set(Calendar.DATE, date);

            CharSequence charSequence = android.text.format.DateFormat.format("dd-MMM-yyyy", calendar1);

            handelTime(charSequence);
        }
    }, year, month, date);

    datePickerDialog.show();
}


private void buildRecyclerView() {

    recyclerView = findViewById(R.id.recyclerView2);
    recyclerView.hasFixedSize();
    layoutManager = new LinearLayoutManager(StudentListActivity.this);
    rAdapter = new AdapterForStudentList(this, listOfNames);

    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setAdapter(rAdapter);

    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
    itemTouchHelper.attachToRecyclerView(recyclerView);

}

public void insertData(String text, String t1, String t2) {
    ListOfNames lt = new ListOfNames(text, t1, t2);
    if (listOfNames.contains(lt)) {
        Toast.makeText(this, "Student Name Already exists!!", Toast.LENGTH_SHORT).show();
    } else {
        listOfNames.add(lt);
        rAdapter.notifyDataSetChanged();
    }

}

public void saveData() {
    sharedPreferences = getSharedPreferences("SHARED PREF", MODE_PRIVATE);
    editor = sharedPreferences.edit();

    Gson gson = new Gson();
    String json = gson.toJson(listOfNames);
    editor.putString(subName, json);
    editor.apply();
}

public void loadData() {


    sharedPreferences = getSharedPreferences("SHARED PREF", MODE_PRIVATE);

    Gson gson = new Gson();
    String json = sharedPreferences.getString(subName, null);
    Type type = new TypeToken<ArrayList<ListOfNames>>() {
    }.getType();

    listOfNames = gson.fromJson(json, type);

    if (listOfNames == null) {
        listOfNames = new ArrayList<>();
    }
}


ListOfNames deletedItem = null;
ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
        return false;
    }

    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        final int position = viewHolder.getAdapterPosition();
        String name = listOfNames.get(position).getStudentName();

        deletedItem = listOfNames.get(position);
        listOfNames.remove(deletedItem);

        sharedPreferences = getSharedPreferences("SHARED PREF", MODE_PRIVATE);
        editor = sharedPreferences.edit();
        editor.remove("text");


        saveData();
        editor.apply();
        rAdapter.notifyItemRemoved(position);

        Snackbar.make(recyclerView, name + "Deleted", Snackbar.LENGTH_LONG)
                .setAction("Undo", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        listOfNames.add(position, deletedItem);
                        rAdapter.notifyItemInserted(position);

                        saveData();
                    }
                }).show();
    }

    @Override
    public void onChildDrawOver(@NonNull Canvas c, @NonNull RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        new RecyclerViewSwipeDecorator.Builder(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)

                .addSwipeLeftBackgroundColor(ContextCompat.getColor(StudentListActivity.this, R.color.my_background))
                .addSwipeLeftActionIcon(R.drawable.ic_delete_black_24dp)
                .create()
                .decorate();
        super.onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);

    }
};

public void fabButton() {
    FloatingActionButton floatingActionButton = findViewById(R.id.fab2);
    floatingActionButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder b = new AlertDialog.Builder(StudentListActivity.this);
            View view = getLayoutInflater().inflate(R.layout.dialogbox_frontpage, null);

            final EditText editText = view.findViewById(R.id.editText);
            b.setView(view);
            b.setTitle("Student name");
            b.setPositiveButton("ok", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    String text = editText.getText().toString().trim();

                    if (text.isEmpty()) {
                        Toast.makeText(StudentListActivity.this, "Please add subject name", Toast.LENGTH_SHORT).show();
                    } else {
                        insertData(text, t1, t2);
                        saveData();
                    }
                }
            });
            b.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
            b.setCancelable(false);
            b.show();
        }
    });
}
公共类StudentListActivity扩展了AppCompatActivity{
私有静态最终字符串DATETIME=“DATETIME”;
私人回收站;
专用回收器查看适配器雷达;
private RecyclerView.LayoutManager LayoutManager;
ArrayList名称列表;
SharedReferences SharedReferences;
SharedReferences.Editor;
字符串t1=“10”;
字符串t2=“100%”;
束;
字符串子名称;
工具栏;
布尔[]项;
@凌驾
创建时受保护的void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.student_列表);
toolbar=findviewbyd(R.id.toolbar);
设置支持操作栏(工具栏);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
bundle=getIntent().getExtras();
subName=bundle.getString(“主题名称”);
if(bundle!=null){
getSupportActionBar().setTitle(子名称);
}
loadData();
日历=Calendar.getInstance();
字符串currentDate=DateFormat.getDateTimeInstance().format(calendar.getTime());
toolbar.setSubtitle(当前日期);
fabButton();
buildRecyclerView();
}
@凌驾
public void onBackPressed(){
super.onBackPressed();
Intent Intent=新的Intent(这是ScrollingActivity.class);
intent.putExtra(“count”,listOfNames.size());
星触觉(意向);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(右菜单.主菜单,菜单);
返回true;
}
@凌驾
公共布尔值OnOptionItemSelected(@NonNull MenuItem item){
开关(item.getItemId()){
案例R.id.changeDateTime:
handleDate();
返回true;
病例R.id.过去就诊人数:
意向意向=新意向(此,PastAttentences.class);
意向。putExtra(“标题”,子名称);
SharedReferences=GetSharedReferences(“我的首选”,模式为私有);
editor=SharedReferences.edit();
字符串结果=SharedReferences.getString(日期时间,null);
意图。putExtra(“键”,结果);
删除(日期时间);
editor.apply();
星触觉(意向);
返回true;
案例R.id.saveButton:
最后一个字符串toolbarDateTime=toolbar.getSubtitle().toString();
SharedReferences=GetSharedReferences(“我的首选”,模式为私有);
editor=SharedReferences.edit();
editor.putString(DATETIME,toolbarDateTime);
editor.apply();
返回true;
}
返回super.onOptionsItemSelected(项目);
}
公共无效处理时间(最终CharSequence CharSequence){
最终日历=Calendar.getInstance();
int Hour=calendar.get(calendar.Hour);
int Minute=calendar.get(calendar.Minute);
布尔值is24Hour=android.text.format.DateFormat.is24HourFormat(此);
TimePickerDialog TimePickerDialog=newtimepickerdialog(这是newtimepickerdialog.onttimesetlistener(){
@凌驾
公共void onTimeSet(时间选择器视图,整数小时,整数分钟){
Calendar calendar1=Calendar.getInstance();
calendar1.set(Calendar.HOUR,HOUR);
calendar1.设置(Calendar.MINUTE,MINUTE);
CharSequence charSequence1=android.text.format.DateFormat.format(“HH:mm:ss a”,calendar1);
toolbar.setSubtitle(charSequence+“”+charSequence1);
}
},小时,分钟,是24小时);
timePickerDialog.show();
}
公共无效处理日期(){
最终日历=Calendar.getInstance();
int year=calendar.get(calendar.year);
int month=calendar.get(calendar.month);
int date=calendar.get(calendar.date);
DatePickerDialog DatePickerDialog=new DatePickerDialog(这是new DatePickerDialog.OnDateSetListener(){
@凌驾
公共void onDateSet(日期选择器视图、整数年、整数月、整数日期){
Calendar calendar1=Calendar.getInstance();
calendar1.set(Calendar.YEAR,YEAR);
calendar1.设置(Calendar.MONTH,MONTH);
calendar1.set(Calendar.DATE,DATE);
CharSequence CharSequence=android.text.format.DateFormat.format(“dd-MMM-yyyy”,calendar1);
手时(charSequence);
}
}年、月、日);
datePickerDialog.show();
}
私有void buildRecyclerView(){
recyclerView=findViewById(R.id.recyclerView2);
RecycleView.hasFixedSize();
layoutManager=新的LinearLayoutManager(StudentListActivity.this);
rAdapter=学生列表的新适配器(这是名称列表);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(rAdapter);
ItemTouchHelper ItemTouchHelper=新的ItemTouchHelper(simpleCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);
}
公共void insertData(字符串文本、字符串t1、字符串t2){
ListOfNames lt=新的ListOfNames(文本,t1,t2);
if(名称列表包含(lt)){
Toast.makeText(这个“学生名已经存在!!”,Toast.LENGTH_SHORT.show();
}否则{
名称列表。添加(lt);
rAdapter.notifyDataSetChanged();
}
}
公共void saveData(){
sharedPreferences=getSharedPreferences(“共享优先”,模式\私有);
editor=SharedReferences.edit();
Gson Gson=新的Gson();
字符串json=gson.toJson(listOfNames);
编辑器.putString(s)
public class AdapterForStudentList extends RecyclerView.Adapter<AdapterForStudentList.StudentViewHolder> {

Context context;
private ArrayList<ListOfNames> mListOfNames;


public static class StudentViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    public TextView studentName, attendence, percentage;
    CheckBox mCheckedBox;
    private ItemClickListener itemClickListener;

    public StudentViewHolder(@NonNull View itemView) {
        super(itemView);
        studentName = itemView.findViewById(R.id.studentName);
        attendence = itemView.findViewById(R.id.attendence);
        percentage = itemView.findViewById(R.id.percentage);
        mCheckedBox = itemView.findViewById(R.id.mCheckBox);
        mCheckedBox.setOnClickListener(this);
    }

    public void setItemClickListener(ItemClickListener ic) {
        itemClickListener = ic;
    }

    @Override
    public void onClick(View v) {
        itemClickListener.onItemClick(v, getLayoutPosition());
    }

    interface ItemClickListener {
        void onItemClick(View v, int position);
    }

}

public AdapterForStudentList(Context context, ArrayList<ListOfNames> listOfNames) {
    this.context = context;
    mListOfNames = listOfNames;
}

@NonNull
@Override
public StudentViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View view = inflater.inflate(R.layout.check_box_cardview, parent, false);

    SharedPreferences preferences = context.getSharedPreferences("checkedItems", MODE_PRIVATE);
    boolean valueBoolean = preferences.getBoolean("KEY", false);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putBoolean("KEY", valueBoolean);
    editor.apply();

    return new StudentViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull StudentViewHolder holder, final int position) {

    ListOfNames currentItems = mListOfNames.get(position);
    holder.studentName.setText(currentItems.getStudentName());
    holder.attendence.setText(currentItems.getAttendent());
    holder.percentage.setText(currentItems.getPercetage());
    holder.mCheckedBox.setChecked(currentItems.getChecked());


    holder.setItemClickListener(new StudentViewHolder.ItemClickListener() {
        @Override
        public void onItemClick(View v, int position) {
            CheckBox checkBox = (CheckBox) v;

            ListOfNames currentItems = mListOfNames.get(position);

            if (checkBox.isChecked()) {

                currentItems.setChecked(true);

            } else {
                currentItems.setChecked(false);
            }
        }
    });
    holder.mCheckedBox.setChecked(getFromSp("mCheckedBox"+position));
    holder.mCheckedBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            saveInSp("mCheckedBox"+position, isChecked);

        }
    });
}



@Override
public int getItemCount() {
    return mListOfNames.size();
}
private boolean getFromSp(String key){
    SharedPreferences preferences = context.getSharedPreferences("checkedItems", MODE_PRIVATE);
    return preferences.getBoolean(key,false);
}

private void saveInSp(String key, boolean value) {
    SharedPreferences preferences = context.getSharedPreferences("checkedItems", MODE_PRIVATE);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putBoolean(key, value);
    editor.apply();
}
holder.mCheckedBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        // ...
    }
});
holder.mCheckedBox.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        CheckBox checkBox = (CheckBox) view;
        boolean isChecked = checkBox.isChecked();
        // ...
    }
});
public class AdapterForStudentList extends RecyclerView.Adapter<AdapterForStudentList.StudentViewHolder> {

    private Context context;
    private ArrayList<ListOfNames> mListOfNames;

    public static class StudentViewHolder extends RecyclerView.ViewHolder {
        public TextView studentName, attendence, percentage;
        CheckBox mCheckedBox;

        public StudentViewHolder(@NonNull View itemView) {
            super(itemView);
            studentName = itemView.findViewById(R.id.studentName);
            attendence = itemView.findViewById(R.id.attendence);
            percentage = itemView.findViewById(R.id.percentage);
            mCheckedBox = itemView.findViewById(R.id.mCheckBox);
        }

    }

    public AdapterForStudentList(Context context, ArrayList<ListOfNames> listOfNames) {
        this.context = context;
        mListOfNames = listOfNames;
    }

    @NonNull
    @Override
    public StudentViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.check_box_cardview, parent, false);
        return new StudentViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull StudentViewHolder holder, final int position) {
        final ListOfNames currentItems = mListOfNames.get(position);
        holder.studentName.setText(currentItems.getStudentName());
        holder.attendence.setText(currentItems.getAttendent());
        holder.percentage.setText(currentItems.getPercetage());
        holder.mCheckedBox.setChecked(currentItems.getChecked());

        holder.mCheckedBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                CheckBox checkBox = (CheckBox) view;
                boolean isChecked = checkBox.isChecked();
                currentItems.setChecked(isChecked);
            }
        });
    }

    @Override
    public int getItemCount() {
        return mListOfNames.size();
    }
}
public class ListOfNames {
    // variables...

    // Create a transient variable to hold the temporary state of the check box
    private transient boolean tempChecked;

    // constructor and other methods...

    // Couple of methods for operations on temporary checks and actual checks
    public void setTemporaryChecked(boolean checked) {
        tempChecked = checked;
    }

    public boolean getTemporaryChecked() {
        return tempChecked;
    }

    public void checkedToTemporaryChecked() {
        tempChecked = checked;
    }

    public void temporaryCheckedToChecked() {
        checked = tempChecked;
    }
}
// Get the temporary checked value instead of the actual one
// (Because you know, RecyclerView recycles views)
holder.mCheckedBox.setChecked(currentItems.getTemporaryChecked());

holder.mCheckedBox.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        CheckBox checkBox = (CheckBox) view;
        boolean isChecked = checkBox.isChecked();
        // Set the temporary checked instead
        currentItems.setTemporaryChecked(isChecked);
    }
});
public void loadData() {
    // ...

    // Set our temporary checks
    // Important because transient variables don't get included in Json string
    for (ListOfNames current: listOfNames)
        current.checkedToTemporaryChecked();
}
case R.id.saveButton:
    // ...

    // Convert temporary checks to actual checks
    for (ListOfNames current: listOfNames)
        current.temporaryCheckedToChecked();
    saveData();

    return true;
// ...