首页 > 解决方案 > 在 RecyclerView 中保存 Checkbox 的状态

问题描述

使用 RecyclerView,我想保存 Checkbox 状态。

在这种情况下,我尝试使用共享首选项,下面的代码是我所拥有的,但它不起作用。

如何在 RecyclerView 中使用 SharedPreferences?下面是我的适配器类。

数据适配器

private Context mCtx;
private boolean isMyValueChecked;

private List<Final> resultList;

//getting the context and product list with constructor
public FavoriteAdapter(Context mCtx, List<Final> resultList) {
    this.mCtx = mCtx;
    this.resultList = resultList;
}

@Override
public FavoriteViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    //inflating and returning our view holder
    LayoutInflater inflater = LayoutInflater.from(mCtx);
    View view = inflater.inflate(R.layout.details_items, null);
    SharedPreferences sharedPreferences= view.getContext().getSharedPreferences("My preference",Context.MODE_PRIVATE);
    isMyValueChecked= sharedPreferences.getBoolean("checkbox",false);

    return new FavoriteViewHolder(view);
}

@Override
public void onBindViewHolder(final FavoriteViewHolder holder, int position) {
    //getting the product of the specified position
    Final result = resultList.get(position);

    holder.checkBox.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            SharedPreferences sharedPreferences= v.getContext().getSharedPreferences("My preference",Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putBoolean("checkbox",holder.checkBox.isChecked());
            editor.apply();
        }
    });
    holder.checkBox.setChecked(isMyValueChecked);
}

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


class FavoriteViewHolder extends RecyclerView.ViewHolder {

    CheckBox checkBox;

    public FavoriteViewHolder(View itemView) {
        super(itemView);


        checkBox=itemView.findViewById(R.id.checkBox);
    }
}

标签: androidsharedpreferences

解决方案


取值isMyValueCheckedonBindViewHolder不是onCreateViewHolder.

并使用唯一 id 将值存储在共享首选项中,因为如果您对每个项目使用相同的键,您的值将被覆盖。

@Override
public void onBindViewHolder(final FavoriteViewHolder holder, int position) {
//getting the product of the specified position
Final result = resultList.get(position);

holder.checkBox.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        SharedPreferences sharedPreferences= v.getContext().getSharedPreferences("My preference",Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean(result.id,holder.checkBox.isChecked()); //use id instead of hard code checkbox
        editor.apply();
    }
});
isMyValueChecked= sharedPreferences.getBoolean(result.id,false); //fetch checked value
holder.checkBox.setChecked(isMyValueChecked);
}

推荐阅读