使用共享首选项从列表中保存复选框状态
saving checkbox states from list with shared preferences
我问了一个关于如何使用文本文件保存复选框状态的问题,但被推荐使用共享首选项。我在使用文本文件之前尝试过这种方法,但遇到了同样的问题 - 列表中的复选框似乎是随机选中和取消选中的。
我的应用程序显示设备上当前安装的应用程序列表,它显示应用程序的标题、图标和一个复选框。如果我选中其中一项并向下滚动并再次返回,它通常会取消选中而其他项目会随机选中。我正在尝试获取它,以便从共享首选项加载复选框状态,并在用户手动选中该框时将其保存。
这是列表视图自定义适配器的代码:
public class AppDetailsAdapter extends BaseAdapter {
private List<AppDetails> data;
private Context context;
public AppDetailsAdapter(Context context, List<AppDetails> data) {
this.context = context;
this.data = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = vi.inflate(R.layout.custom_row_layout, null);
}
ImageView icon = (ImageView) view.findViewById(R.id.icon);
TextView text = (TextView) view.findViewById(R.id.text);
final CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkBox);
final AppDetails item = data.get(position);
text.setText(item.name);
icon.setImageDrawable(item.icon);
SharedPreferences settings = context.getSharedPreferences("data",Context.MODE_PRIVATE);
boolean Checked = settings.getBoolean(item.name, false);
checkBox.setChecked(Checked);
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// Handle your conditions here
if(checkBox.isChecked()==true){
SharedPreferences settings = context.getSharedPreferences("data", Context.MODE_PRIVATE);
settings.edit().putBoolean(item.name,true).commit();
Toast.makeText(context,"You selected "+item.name, Toast.LENGTH_SHORT).show();
}
else {
SharedPreferences settings = context.getSharedPreferences("data", Context.MODE_PRIVATE);
settings.edit().putBoolean(item.name,false).commit();
Toast.makeText(context,"You deselected "+item.name, Toast.LENGTH_SHORT).show();
}
}
});
return view;
}
}
发生这种情况是因为视图回收。
你能试试一件事吗:
而不是这个
if (view == null) {
LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = vi.inflate(R.layout.custom_row_layout, null);
}
随便写
LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = vi.inflate(R.layout.custom_row_layout, null);
再次运行。
我问了一个关于如何使用文本文件保存复选框状态的问题,但被推荐使用共享首选项。我在使用文本文件之前尝试过这种方法,但遇到了同样的问题 - 列表中的复选框似乎是随机选中和取消选中的。
我的应用程序显示设备上当前安装的应用程序列表,它显示应用程序的标题、图标和一个复选框。如果我选中其中一项并向下滚动并再次返回,它通常会取消选中而其他项目会随机选中。我正在尝试获取它,以便从共享首选项加载复选框状态,并在用户手动选中该框时将其保存。
这是列表视图自定义适配器的代码:
public class AppDetailsAdapter extends BaseAdapter {
private List<AppDetails> data;
private Context context;
public AppDetailsAdapter(Context context, List<AppDetails> data) {
this.context = context;
this.data = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = vi.inflate(R.layout.custom_row_layout, null);
}
ImageView icon = (ImageView) view.findViewById(R.id.icon);
TextView text = (TextView) view.findViewById(R.id.text);
final CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkBox);
final AppDetails item = data.get(position);
text.setText(item.name);
icon.setImageDrawable(item.icon);
SharedPreferences settings = context.getSharedPreferences("data",Context.MODE_PRIVATE);
boolean Checked = settings.getBoolean(item.name, false);
checkBox.setChecked(Checked);
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// Handle your conditions here
if(checkBox.isChecked()==true){
SharedPreferences settings = context.getSharedPreferences("data", Context.MODE_PRIVATE);
settings.edit().putBoolean(item.name,true).commit();
Toast.makeText(context,"You selected "+item.name, Toast.LENGTH_SHORT).show();
}
else {
SharedPreferences settings = context.getSharedPreferences("data", Context.MODE_PRIVATE);
settings.edit().putBoolean(item.name,false).commit();
Toast.makeText(context,"You deselected "+item.name, Toast.LENGTH_SHORT).show();
}
}
});
return view;
}
}
发生这种情况是因为视图回收。
你能试试一件事吗:
而不是这个
if (view == null) {
LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = vi.inflate(R.layout.custom_row_layout, null);
}
随便写
LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = vi.inflate(R.layout.custom_row_layout, null);
再次运行。