You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SharedPreferences存储多选对话框选项并复用

解决多选对话框选中项存储与使用问题

首先,先修正你对话框中的一个小问题:当前你只维护了mSelectedItems来记录选中项,但itemsChecked数组并没有随着用户的选择实时更新——这会导致你后续用itemsChecked判断时拿到的不是最新状态。所以第一步要在OnMultiChoiceClickListener里同步更新这个数组:

@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
    // 同步更新itemsChecked数组,确保它始终是最新选中状态
    itemsChecked[which] = isChecked;
    if (isChecked) {
        mSelectedItems.add(which);
    } else if (mSelectedItems.contains(which)) {
        mSelectedItems.remove(Integer.valueOf(which));
    }
}

一、将选中项保存到SharedPreferences

SharedPreferences不支持直接存储数组,我们可以用两种简洁的方式实现存储:

方式1:将boolean数组转为JSON字符串存储(推荐)

这种方式更适合选项数量较多的场景,需要用到Gson(如果你的项目还没依赖Gson,在build.gradle中添加implementation 'com.google.code.gson:gson:2.10.1'):

.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int id) {
        // 获取SharedPreferences实例
        SharedPreferences prefs = getSharedPreferences("MyAppPrefs", MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        
        // 用Gson将boolean数组转为JSON字符串
        Gson gson = new Gson();
        String checkedItemsJson = gson.toJson(itemsChecked);
        
        // 存储到SharedPreferences
        editor.putString("selected_options", checkedItemsJson);
        editor.apply(); // 异步提交,也可用commit()同步提交
        
        // 同步处理选中项的业务逻辑
        handleSelectedItems();
    }
})

后续读取存储的选中状态时,再把JSON字符串转回数组:

SharedPreferences prefs = getSharedPreferences("MyAppPrefs", MODE_PRIVATE);
String checkedItemsJson = prefs.getString("selected_options", null);
if (checkedItemsJson != null) {
    Gson gson = new Gson();
    itemsChecked = gson.fromJson(checkedItemsJson, boolean[].class);
}

方式2:逐个存储每个选项的状态

如果不想依赖第三方库,可以逐个存储每个选项的选中状态:

.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int id) {
        SharedPreferences prefs = getSharedPreferences("MyAppPrefs", MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        
        // 遍历数组,为每个选项单独存储状态
        for (int i = 0; i < itemsChecked.length; i++) {
            editor.putBoolean("option_" + i, itemsChecked[i]);
        }
        editor.apply();
        
        handleSelectedItems();
    }
})

读取时:

SharedPreferences prefs = getSharedPreferences("MyAppPrefs", MODE_PRIVATE);
for (int i = 0; i < itemsChecked.length; i++) {
    itemsChecked[i] = prefs.getBoolean("option_" + i, false);
}

二、使用选中项执行逻辑

你设想的if(itemsChecked[1]){ deleteDatabases(); }是完全可行的,只要itemsChecked数组已经被正确更新(也就是我们第一步添加的itemsChecked[which] = isChecked;)。

另外,你也可以通过mSelectedItems来判断,这种方式更适合遍历所有选中项的场景:

private void handleSelectedItems() {
    // 检查第二个选项(索引1)是否被选中
    if (mSelectedItems.contains(1)) {
        deleteDatabases();
    }
    
    // 示例:遍历所有选中项,执行对应业务逻辑
    for (int position : mSelectedItems) {
        switch (position) {
            case 0:
                // 执行第一个选项的逻辑
                break;
            case 1:
                deleteDatabases();
                break;
            case 2:
                // 执行第三个选项的逻辑
                break;
            // 更多选项的逻辑...
        }
    }
}

两种方式都可以,根据你的业务场景和习惯选择即可。

内容的提问来源于stack exchange,提问作者androidexpert35

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:14:01