android - 在 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);
}
}
解决方案
取值isMyValueChecked
而onBindViewHolder
不是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);
}
推荐阅读
- java - 使用链接列表登录和注册 - 无法访问从其他 servlet 创建的对象
- html - 导航栏在滚动时消失
- elasticsearch - elastic apm无法连接到elasticsearch
- git - 无法在 Docker 快速入门终端中克隆 git 存储库 - 无法创建工作树目录“节点公告板”:权限被拒绝
- javascript - 路由器查询参数未定义但仍可在 HTML 中显示
- python - 我给这个函数两个参数,它说我只给了一个
- python - 将 Excel 电子表格的内容保存到单个字符串 python
- python - 如何在 Python 中格式化打印语句段落字符串
- web-services - 如何从谷歌地图 api 中提取“在此位置”信息?
- opengl - OpenGL Phong 光照:镜面高光是错误的