退出应用程序后如何存储复选框状态?



我有选项卡布局(3 个片段(,每个片段都有回收器视图和复选框。我设置了 onClickListener,但在退出应用程序后,复选框状态被重置。我尝试了一些我在网上找到的解决方案(关于共享偏好(,但都不适合我。也许我实施错了。你可以帮我吗?

另外,如果需要,我可以与您分享我的片段文件。

RecyclerView Java:

public class RecyclerViewAdapter extends RecyclerView.Adapter <RecyclerViewAdapter.MyViewHolder>{
Context mContext;
List<RecTab1> mData;
public RecyclerViewAdapter(Context mContext, List<RecTab1> mData) {
this.mContext = mContext;
this.mData = mData;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v ;
v = LayoutInflater.from(mContext).inflate(R.layout.item_tab1,parent,false);
MyViewHolder vHolder = new MyViewHolder(v);
return vHolder;
}
@Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, int position) {
holder.tv_name.setText(mData.get(position).getName());
holder.tv_subName.setText(mData.get(position).getSubName());
holder.cb_checkbox.setChecked(mData.get(position).getSelected());
holder.cb_checkbox.setTag(position);
holder.cb_checkbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Integer pos = (Integer) holder.cb_checkbox.getTag();
Toast.makeText(mContext, mData.get(pos).getName() + " clicked!", Toast.LENGTH_LONG).show();
if (mData.get(pos).getSelected()) {
mData.get(pos).setSelected(false);
} else {
mData.get(pos).setSelected(true);
}
}
});
}
@Override
public int getItemCount() {
return mData.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder{
private TextView tv_name;
private TextView tv_subName;
private CheckBox cb_checkbox;
public MyViewHolder (View itemView){
super (itemView);
tv_name = (TextView) itemView.findViewById(R.id.Item1Name);
tv_subName = (TextView) itemView.findViewById(R.id.Item1SubName);
cb_checkbox = (CheckBox) itemView.findViewById(R.id.CheckboxID);
}
}
}

项目爪哇:

public class RecTab1 {
private String Name;
private String SubName;
private boolean isSelected;
public RecTab1(){
}
public RecTab1 (String name, String subName){
Name = name;
SubName = subName;
}
public String getName() {
return Name;
}
public String getSubName() {
return SubName;
}
public void setName(String name) {
Name = name;
}
public void setSubName(String subName) {
SubName = subName;
}
public boolean getSelected() {
return isSelected;
}
public void setSelected(boolean selected) {
isSelected = selected;
}
}

基本上有两种持久性:

  • 临时持久性(范围:只能在Activity/Fragment内部使用(
  • 长期持久性(范围:超越Activity/Fragment的生命周期(

我认为,您通过在某处创建Rect1对象来实现第一种技术(我假设您没有将它们保存在数据库中,因为我没有看到这些代码行(,然后尝试在其他地方需要时访问这些值。但是,当您tabsTabLayout中切换片段时,这些变量将在销毁和重新创建片段时销毁并重新创建
你需要的是第二个。
这种持久性有许多版本,例如: -
共享首选项 -
Sqlite数据库
- 在线数据库,如Firebase
例如:在您的情况下,如果您有少量tabs又有少量信息要持久化,那么您可以使用SharedPreferences。如果有更多的tabs,反过来又有更多的信息需要持久化,那么使用 Sqlite 数据库会更好。请参阅此链接,了解如何使用 Room 在 Sqlite 中保存数据

现在使用SharedPreferences,您可以将CheckBoxchecked状态保存到onCheckChangedListener方法的首选项文件中,如下所示:

public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(mContext).inflate(R.layout.item_tab1, parent, false);
Checkbox cb_checkbox = v.findViewById(R.id.CheckboxID);
cb_checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mContext.getSharedPreferences("com.example.yourapp.SAVED_STATE", Context.MODE_PRIVATE)  
.edit()  
.putBoolean("cb_checkbox", isChecked)
.apply();
}
});

我在onCreateViewHolder中设置了onCheckChangedListener,因为mContext可用。您也可以在MyViewHolder类内部完成,在MyViewHolder的构造函数中传递Context对象。不建议onBindViewHolder()中设置侦听器,因为它在绑定期间被多次调用,因此,即使对于已设置侦听器的MyViewHolder对象中的那些cb_checkbox,也会有重复的侦听器设置。

现在,要检索cb_checkboxchecked状态 ,我们将在SharedPreferences中看到查找信息,如果它以前保存为:

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
// your other binding code
// code for binding previous state of the checkbox if is saved otherwise false as a default 
boolean checkedState = mContext.getSharedPreferences("com.example.yourapp.SAVED_STATE", MODE_PRIVATE)
.getBoolean("cb_checkbox", false);
holder.cb_checkbox.setChecked(checkedState);
}

最新更新