【问题标题】:unable to save sharedPreference state无法保存 sharedPreference 状态
【发布时间】:2025-11-22 10:25:01
【问题描述】:

我在我的 RecyclerView 适配器中使用了一个切换按钮作为收藏夹

编辑:以下解决方案有效,但现在当我收藏一个并重新启动应用程序时,所有按钮都会被收藏,对于不喜欢的情况也是如此,请提供解决方案

代码如下:

@Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
        MyModel myModel = myModelList.get(position);
        holder.imageView.setImageResource(myModel.getImage());
        holder.textView.setText(myModel.getText());
        holder.toggle_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                boolean isFavourite = readStae();
                if (isFavourite) {
                    holder.toggle_btn.setBackgroundResource(R.drawable.fav);
                    isFavourite = false;
                    saveStae(isFavourite);
                } else {
                    holder.toggle_btn.setBackgroundResource(R.drawable.unfav);
                    isFavourite = true;
                    saveStae(isFavourite);
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return myModelList.size();
    }
    private void saveStae(boolean isFavourite) {
        SharedPreferences aSharedPreferenes = context.getSharedPreferences(
                "Favourite", Context.MODE_PRIVATE);
        SharedPreferences.Editor aSharedPreferenesEdit = aSharedPreferenes
                .edit();
        aSharedPreferenesEdit.putBoolean("State", isFavourite);
        aSharedPreferenesEdit.commit();
    }

    private boolean readStae() {
        SharedPreferences aSharedPreferenes = context.getSharedPreferences(
                "Favourite", Context.MODE_PRIVATE);
        return aSharedPreferenes.getBoolean("State", false);
    }
}

当我重新启动应用程序时,收藏按钮不存在。

我在做什么错,请解释解决方案,谢谢

【问题讨论】:

    标签: android sharedpreferences


    【解决方案1】:

    您在 Click Listener 中调用 readState(),所以在 onBindViewHolder 上,它不会执行该方法。你需要像这样改变你的代码。

     @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
        MyModel myModel = myModelList.get(position);
        holder.imageView.setImageResource(myModel.getImage());
        holder.textView.setText(myModel.getText());
        boolean isFavourite = readStae();
         if (isFavourite) {
            holder.toggle_btn.setBackgroundResource(R.drawable.fav);
         } else {
            holder.toggle_btn.setBackgroundResource(R.drawable.unfav);
        } }
    

    然后在 ViewHolder 类中应用点击监听器。

    【讨论】:

    • 好收获!没有人能看到它。
    • 现在,如果我收藏了一个,然后重新启动应用程序,那么所有按钮都会被收藏,对于不收藏的情况也是如此。怎么办?
    • aSharedPreferenesEdit.putBoolean("State", isFavourite);此行为所有按钮保存 true,使用按钮文本或与该按钮相关的任何其他内容更改“状态”文本。