【问题标题】:How to store checkbox statuses after I exit app?退出应用程序后如何存储复选框状态?
【发布时间】:2020-09-25 11:15:07
【问题描述】:

我有标签布局(3 个片段),每个片段都有 recyclerview 和复选框。我设置了 onClickListener,但是在我退出我的应用程序后,复选框状态被重置。我尝试了一些解决方案,我在网上找到了一些解决方案(关于共享偏好),但都不适合我。也许我执行错了。你能帮帮我吗?

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

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

项目java:

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

【问题讨论】:

  • 我之前发现了这个,但我不知道如何在我的应用程序中实现,因为我有 Fragment 和 Recyclerview 适配器,我不知道我应该在哪里放置代码。
  • 既然您想自定义viewholder 中的视图,您需要将此代码放在adapter 类中。在ViewHolder 类中监听checkboxcheckChanged 事件,并使用SharedPreferences 设置当前checked 信息。然后稍后在 onBindViewHolder() 方法中检索它。
  • 我无法处理。我整天都在努力。还是谢谢。

标签: java android android-studio checkbox android-recyclerview


【解决方案1】:

持久化基本上有2种:

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

我认为,您通过在某处创建Rect1 对象来实现第一种技术(我假设您没有将它们保存在数据库中,因为我没有看到那些代码行)然后尝试访问其他地方需要时的值。但是,当您在TabLayout 中的tabs 之间切换时,这些变量将在稍后销毁和重新创建片段时被销毁和重新创建。
您需要的是第二个一。
这种持久性有很多版本:
- 共享偏好
- Sqlite 数据库
- Firebase 等在线数据库
例如:在您的情况下,如果您的 tabs 数量很少,而要保留的信息数量很少,则可以使用 SharedPreferences。如果有更多的tabs 并且反过来有更多的信息要持久化,那么使用 Sqlite 数据库会更好。 See this link about using Room to save data in 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);
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    相关资源
    最近更新 更多