Android 如何在SharedReferences RecyclerView中保存特定复选框项并检索它们

Android 如何在SharedReferences RecyclerView中保存特定复选框项并检索它们,android,sharedpreferences,Android,Sharedpreferences,我在RecyclerView中有一些数据,每个项目中都有一个复选框按钮。我使用SharedReference保存特定的检查数据并检索它们 例如:如果我只勾选了数据“A”,它将只保存数据“A”。我写了一些代码来实现这一点,但每次我检查特定数据时,它都会检查所有数据,每次我检查特定数据时,它都会检查所有数据 我已经尝试了很多天来解决这个问题,但直到现在仍然坚持 MainActivity.java public class HomeActivity extends AppCompatActivity

我在
RecyclerView
中有一些数据,每个项目中都有一个复选框按钮。我使用
SharedReference
保存特定的检查数据并检索它们

例如:如果我只勾选了数据“A”,它将只保存数据“A”。我写了一些代码来实现这一点,但每次我检查特定数据时,它都会检查所有数据,每次我检查特定数据时,它都会检查所有数据

我已经尝试了很多天来解决这个问题,但直到现在仍然坚持

MainActivity.java

public class HomeActivity extends AppCompatActivity {

private RecyclerView recyclerView;
private List<Story> storyList  = new ArrayList<>();
AppPreferences appPreferences;
private Context context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    recyclerView = findViewById(R.id.recycler_view);

    SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("MyPref", 0);
    PreferenceManager preferenceManager = new PreferenceManager(sharedPreferences);
    appPreferences = new AppPreferences(preferenceManager);

    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
    recyclerView.setAdapter(new AdapterHome(storyList, this, appPreferences));
    setUpData();
}

private void setUpData() {

    for (int i = 0; i < 10; i++) {
        Story story = new Story();
        story.setIdStory(String.valueOf(i));
        story.setIsLiked(0);
        story.setTitle("Sample " + i);
        storyList.add(story);
    }

} }
public class AdapterHome extends RecyclerView.Adapter<AdapterHome.ViewHolder> {

public static final String PREFS_NAME = "PRODUCT_APP";
public static final String FAVORITES = "Product_Favorite";

private List<Story> storyList;
private List<Story> favorites;
private Context context;

private int changedItemPosition;
private boolean isLiked;
private AppPreferences appPreferences;
private SharedPreferences preferences;
private CheckBox checkBox;
Boolean checked = false;
Boolean[] checkedStatus;

public AdapterHome(List<Story> storyList, Context context, AppPreferences appPreferences) {
    this.storyList = storyList;
    this.context = context;
    this.appPreferences = appPreferences;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.item_story_home, parent, false));
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    holder.setViewData(storyList.get(position), holder.getAdapterPosition());
}

@Override
public int getItemCount() {
    return storyList.size();
}


//The problem lays here
public void putHeart(boolean isChecked, String key) {
    SharedPreferences sharedPreferences = context.getSharedPreferences("MyPref", Activity.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putBoolean("MyPref", isChecked);
    editor.commit();
}

public boolean getHeart(String key) {
    SharedPreferences sharedPreferences = context.getSharedPreferences("MyPref", Activity.MODE_PRIVATE);
    Boolean isChecked = sharedPreferences.getBoolean("MyPref", false);
    return isChecked;
}



//ViewHolder
public class ViewHolder extends RecyclerView.ViewHolder {

    private TextView textView;
    private CheckBox likeCheckBox;

    public ViewHolder(View itemView) {
        super(itemView);
        textView = itemView.findViewById(R.id.text_view);
        likeCheckBox = itemView.findViewById(R.id.like_button_cb);
    }

    public void setViewData(final Story story, final int adapterPosition) {

        textView.setText(story.getTitle());

        if (story.getIsLiked() == 1) {
            likeCheckBox.setChecked(true);
        }
        else {
            likeCheckBox.setChecked(false);
        }

        // The problem lays here
        boolean isChecked = getHeart("MyPref");
        likeCheckBox.setChecked(isChecked);

        likeCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                changedItemPosition = adapterPosition;

                if (buttonView.isPressed()) {
                    if (isChecked) {
                        isLiked = true;
                        updateLikes();
                        appPreferences.saveFavouriteCard(story);
                        putHeart(isChecked,"isChecked"); // The problem lays here
                        Toast.makeText(context, "Saved", Toast.LENGTH_SHORT).show();
                    }
                    else {
                        isLiked = false;
                        updateLikes();
                        appPreferences.deleteCard(story.getIdStory());
                        putHeart(isChecked,"isChecked"); // The problem lays here
                        Toast.makeText(context, "Removed", Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });

    } //setviewdata

    public void updateLikes() {
        if (isLiked && storyList.get(changedItemPosition).getIsLiked() == 0) { //jika dilakukan like (pada posisi hati kosong) di halaman home
            storyList.get(changedItemPosition).setIsLiked(1); //maka jadikan hati berwarna merah di halaman favourite list
            notifyItemChanged(changedItemPosition, ACTION_LIKE_IMAGE_CLICKED);
        }
        else if (!isLiked && storyList.get(changedItemPosition).getIsLiked() == 1) { //jika like dicabut (pada posisi hati yang sedang merah) di halaman home
            storyList.get(changedItemPosition).setIsLiked(0); //maka cabut juga warna merah di halaman favourite list
            notifyItemChanged(changedItemPosition, ACTION_LIKE_IMAGE_CLICKED);
        }

    } //updateLikes

} //viewholder } //AdapterHome
Story.java

public class Story {
public Story(){}

private String idStory;
private String title;
private int isLiked;
private int ambilID;

public String getIdStory() {
    return idStory;
}
public void setIdStory(String isStory) {
    this.idStory = isStory;
}

public int ambilIdStory() {
    return ambilID;
}
public void putIdStory(int isStory) {
    this.ambilID = isStory;
}

public String getTitle() {
    return title;
}
public void setTitle(String title) {
    this.title = title;
}

public int getIsLiked() {
    return isLiked;
}
public void setIsLiked(int isLiked) {
    this.isLiked = isLiked;
}

@Override
public String toString() {
    return GsonUtils.convertToJSON(this);
}
}
更新代码[工作]

最后,问题已经解决了。它可以用每个项目的唯一标识符来解决。因此,即使故事顺序更改,也会保存故事的已检查状态

public void putHeart(boolean isChecked, int position) {
    SharedPreferences sharedPreferences = context.getSharedPreferences("MyPref", Activity.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    Story story = storyList.get(position);
    editor.putBoolean(story.getIdStory(), isChecked);
    editor.commit();
}

public boolean getHeart(int position) {
    SharedPreferences sharedPreferences = context.getSharedPreferences("MyPref", Activity.MODE_PRIVATE);
    Story story = storyList.get(position);
    boolean isChecked = sharedPreferences.getBoolean(story.getIdStory(), false);
    return isChecked;
}

由于数据总是生成的,所以可以使用列表中的位置作为首选项中布尔值的键

SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean(String.valueOf(position), isChecked);
editor.commit();
然后:

SharedPreferences.Editor editor = sharedPreferences.edit();
boolean b = editor.getBoolean(String.valueOf(position), false);
更新

boolean isChecked = getHeart(getAdapterPosition());
likeCheckBox.setChecked(isChecked);
likeCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            changedItemPosition = getAdapterPosition();

            if (buttonView.isPressed()) {
                if (isChecked) {
                    isLiked = true;
                    updateLikes();
                    appPreferences.saveFavouriteCard(story);
                    putHeart(isChecked, getAdapterPosition()); // The problem lays here
                    Toast.makeText(context, "Saved", Toast.LENGTH_SHORT).show();
                }
                else {
                    isLiked = false;
                    updateLikes();
                    appPreferences.deleteCard(story.getIdStory());
                    putHeart(isChecked,getAdapterPosition()); // The problem lays here
                    Toast.makeText(context, "Removed", Toast.LENGTH_SHORT).show();
                }
            }
        }
    });
保存和恢复状态

public void putHeart(boolean isChecked, int position) {
    SharedPreferences sharedPreferences = context.getSharedPreferences("MyPref", Activity.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putBoolean(String.valueOf(position), isChecked);
    editor.commit();
}

public boolean getHeart(int position) {
    SharedPreferences sharedPreferences = context.getSharedPreferences("MyPref", Activity.MODE_PRIVATE);
    Boolean isChecked = sharedPreferences.getBoolean(String.valueOf(position), false);
    return isChecked;
}

您应该为您的
故事
生成唯一标识符。如身份证、姓名等

// put isChecked to shared prefs
Story story = storyList.get(pos);
editor.putBoolean(Integer.toString(story.getId()), isChecked);

这样,即使故事顺序更改,也会保存故事的已检查状态。

无法解析符号“位置”。这就是问题所在。我已经尝试过很多次了,这是在onCheckedChanged方法中的结果,您可以使用getAdapterPosition()检索位置;并将其传递给保存状态方法。你太棒了。。你的代码是工作。谢谢你,伙计。我从没想过要这么做。可怜的我。。。hiksBut问题是当故事顺序改变时,它可以处理特定的项目。你能帮帮我吗?是的,我以前就知道。但是,我该怎么做呢?我试了很多次,但都失败了。你是说生成一个id?是的。生成Id,将Id放入
SharedReferences
并获取Id。我已经更新了我的答案,向您展示了如何生成唯一的Id。。这个问题把我带到了这里。
故事
的唯一标识符。如id、名称等已生成。但仍然不起作用。你能给我写完整的代码吗?
public void putHeart(boolean isChecked, int position) {
    SharedPreferences sharedPreferences = context.getSharedPreferences("MyPref", Activity.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    Story story = storyList.get(position);
    editor.putBoolean(story.getIdStory(), isChecked);
    editor.commit();
}

public boolean getHeart(int position) {
    SharedPreferences sharedPreferences = context.getSharedPreferences("MyPref", Activity.MODE_PRIVATE);
    Story story = storyList.get(position);
    boolean isChecked = sharedPreferences.getBoolean(story.getIdStory(), false);
    return isChecked;
}
// get isChecked from shared prefs
Story story = storyList.get(pos);
boolean isChecked = boolean b = editor.getBoolean(Integer.toString(story.getId()), false);

// generate id
// when you create a Story

int lastIdGenerated = editor.getInt("LAST_ID_GENERATED", 1);
int newId = lastIdGenerated + 1;
editor.putInt("LAST_ID_GENERATED", newId);

Story newStory = new Story();
newStory.setId(newId);