复选框 SharedPreference 在 Recyclerview 复选框中不起作用

Checkbox SharedPreference Not working in Recyclerview Checkbox

我正在尝试实施 SharedPreference 以在我的 RecyclerView 适配器 中存储复选框检查列表。 我能够正确记录检查列表数组。但我无法将其保存到共享首选项并在每次重新打开应用程序时恢复它。

这是我的 RecyclerView 适配器代码。

public class HomeManager extends RecyclerView.Adapter<HomeManager.RecyclerViewHolder> {
    private static DisplayImageOptions displayOptions;
    static View v1;
    private SparseBooleanArray mCheckedItems = new SparseBooleanArray();

    static {
        displayOptions = DisplayImageOptions.createSimple();
    }

    public static class RecyclerViewHolder extends RecyclerView.ViewHolder {

        CheckBox mCheck;

        RecyclerViewHolder(final View itemView) {
            super(itemView);

            mCheck = (CheckBox) itemView.findViewById(R.id.PROJECT_fav);
            SharedPreferences update = v1.getContext().getSharedPreferences("my_prefs", 0);
            String Check = update.getString("Check", "");
            Log.e("Checked Array = ", Check);

        }
    }

    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        v1 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recyclerview_item, viewGroup, false);

        return new RecyclerViewHolder(v1);

    }

    @Override
    public void onBindViewHolder(final RecyclerViewHolder viewHolder, int i) {

//      viewHolder.mCheck.setChecked(mCheckedItems);


        viewHolder.mCheck.setChecked(mCheckedItems.get(i));
        viewHolder.mCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    Snackbar snackbar = Snackbar.make(viewHolder.itemView, "Item Favorited", Snackbar.LENGTH_SHORT);
                    snackbar.show();
                } else {
                    Snackbar snackbar = Snackbar.make(viewHolder.itemView, "Item Unfavorited", Snackbar.LENGTH_SHORT);
                    snackbar.show();
                }
                int position = viewHolder.getAdapterPosition();
                mCheckedItems.put(position, isChecked);
                List<Integer> selected = new ArrayList<>();
                for (int i = 0; i < mCheckedItems.size(); i++) {
                    final boolean checked = mCheckedItems.valueAt(i);
                    if (checked) {
                        selected.add(mCheckedItems.keyAt(i));
                    }
                }
                Log.e("Checked Array = ", String.valueOf(selected));
                SharedPreferences prefs = v1.getContext().getSharedPreferences("my_prefs", Context.MODE_PRIVATE);
                SharedPreferences.Editor edit = prefs.edit();
                edit.putString("Checkbox", String.valueOf(selected));
                edit.commit();
                Log.e("Shared Preference = ", String.valueOf(edit));
            }
        });

}

问题很简单 - 您必须使用相同的密钥进行存储和访问。

您目前正在尝试使用密钥 "Check" 访问您存储的数据:

SharedPreferences update = v1.getContext().getSharedPreferences("my_prefs", 0);
String Check = update.getString("Check", "");

但是你用密钥存储它 "Checkbox":

SharedPreferences prefs = v1.getContext().getSharedPreferences("my_prefs", Context.MODE_PRIVATE);
SharedPreferences.Editor edit = prefs.edit();
edit.putString("Checkbox", String.valueOf(selected));
edit.commit();

两者都使用 "Check" 或 "Checkbox"!你不能混搭。

您已将 trh 字符串作为 Checkbox

的共享首选项
 edit.putString("Checkbox", String.valueOf(selected));

但是您得到的字符串名为 Check

SharedPreferences update = v1.getContext().getSharedPreferences("my_prefs",0);
    String Check = update.getString("Check", "");

改为

 String Check = update.getString("Checkbox", "");