【问题标题】:Trying to save the state of checkbox and the data within that checkbox even when app is closed即使应用程序关闭,也尝试保存复选框的状态和该复选框中的数据
【发布时间】:2020-08-07 07:06:02
【问题描述】:

我创建了一个复选框,一次只能选择一个复选框。这工作正常。我的应用程序要求该复选框始终处于选中状态,即使在应用程序关闭时也是如此。我想知道的是如何获取复选框以及使用此复选框存储的数据以保存,即使我的应用程序已关闭。我做了一些挖掘,发现您可以使用共享首选项,但我似乎无法弄清楚如何在我的应用程序中实现它。这是我目前用来实现复选框的代码:firebase recycler adapter

 adapter1 = new FirebaseRecyclerAdapter<contact, contactAdapter>(options1) {
            @Override
            protected void onBindViewHolder(@NonNull final contactAdapter holder, final int position, @NonNull contact model) {
                holder.contactName.setText(model.getContactName());
                holder.contactPhone.setText(model.getContactPhone());
                if(lastCheckedPos == position){
                    holder.chk.setChecked(true);
                }
                else{
                    holder.chk.setChecked(false);
                }
                holder.chk.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        if (position == lastCheckedPos) {
                            holder.chk.setChecked(false);
                            lastCheckedPos = -1;
                        }else {
                            lastCheckedPos = position;
                            for (int i = 0; i < adapter1.getItemCount(); i++) {
                                if (adapter1.getItem(i).isSelected(true)) {
                                    number = ((TextView) holder.itemView.findViewById(R.id.contactPhone)).getText().toString();
                                    Toast.makeText(getActivity(), "Data Inserted....." + number, Toast.LENGTH_SHORT).show();
                                } else {
                                    Toast.makeText(getActivity(), "Error", Toast.LENGTH_LONG).show();
                                }
                            }
                            contactsView.post(new Runnable()
                            {
                                @Override
                                public void run() {
                                    adapter1.notifyDataSetChanged();
                                }
                            });

                        }
                    }
                });
            }

            @NonNull
            @Override
            public contactAdapter onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                return new contactAdapter(LayoutInflater.from(getActivity()).inflate(R.layout.item_contacts, parent, false));

            }
        };

适配器类

public class contactAdapter extends RecyclerView.ViewHolder{

    public TextView contactName, contactPhone;
    CheckBox chk;
    AdapterView.OnItemClickListener itemClickListener;




    public contactAdapter(@NonNull View itemView) {
        super(itemView);
        contactName = itemView.findViewById(R.id.contactName);
        contactPhone = itemView.findViewById(R.id.contactPhone);
        chk = itemView.findViewById(R.id.myCheckBox);
        this.setIsRecyclable(false);

    }
}

关于如何在我的应用关闭时保存复选框的任何建议?

【问题讨论】:

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


    【解决方案1】:

    尝试在shared prefrences中保存被点击项的位置和状态:

    @Override
    protected void onBindViewHolder(@NonNull final contactAdapter holder, final int position, @NonNull contact model) {
    
    //setting the views
    holder.contactName.setText(model.getContactName());
    holder.contactPhone.setText(model.getContactPhone());
    
    //check prefrences for the state of the check
    SharedPreferences prefs = getSharedPreferences("check", MODE_PRIVATE); 
    String check_state = prefs.getString( "state", "default");
    
    
    if(check_state.equals("true"+String.valueOf(position))){
    
    holder.chk.setChecked(true);
    
    
    }else if (check_state.equals("false"+String.valueOf(position))){
    
    holder.chk.setChecked(false);
    
    }else{
    
    holder.chk.setChecked(false);
    
    }
    
    
    
    
    
    //on click save the state in preference
    
    holder.chk.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    
    if (isChecked) {
    //checked
    holder.chk.setChecked(true);
    
    //save to prefrences
    
    SharedPreferences.Editor editor = getSharedPreferences("check", MODE_PRIVATE).edit();
    editor.putString("state", "true"+String.valueOf(position));
    editor.apply();
    adapter1.notifyDataSetChanged();
    
    }else {
    //unchecked
    holder.chk.setChecked(false);
    
    //save to prefrences
    
    SharedPreferences.Editor editor = getSharedPreferences("check", MODE_PRIVATE).edit();
    editor.putString("state", "false"+String.valueOf(position));
    editor.apply();
    adapter1.notifyDataSetChanged();
    
    
    }
    
    }
    });
    
    }
    

    【讨论】:

    • 我试过你的方法,但现在我可以选择多个复选框。我只想要它,以便一次只能选择一个复选框。
    • 有什么建议吗?
    • 我不得不将 this.notifyDataSetChanged(); 中的这个更改为我的适配器的名称,现在它工作正常。感谢所有的帮助。
    • 好的,祝你好运。
    猜你喜欢
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 2012-04-18
    • 2011-12-31
    相关资源
    最近更新 更多