我有一个带有multiselectListPreference的Android应用程序,我正在使用onPreferenceChange()方法更新该首选项的摘要。我已经设法编写了基于newValues参数更新摘要的代码,但是对象的内容与用户选择的实际选项不匹配。
这是我的代码:

public boolean onPreferenceChange(Preference preference, Object newValue) {
    if (preference instanceof MultiSelectListPreference) {
        List<String> newValues = new ArrayList<>((HashSet<String>) newValue);

        MultiSelectListPreference pref = (MultiSelectListPreference) preference;
        ArrayList<String> newSummary = new ArrayList<>();

        ArrayList<CharSequence> values = new ArrayList<>(Arrays.asList(pref.getEntryValues()));

        for (int i = 0; i < newValues.size(); i++) {
            int currentIndex = findIndexOfString(values, newValues.get(i).replaceAll(" ", ""));

            String title = (currentIndex >= 0) ? pref.getEntries()[currentIndex].toString().replaceAll(" ", "") : "";

            newSummary.add(title);
        }

        pref.setSummary(TextUtils.join(", ", newSummary));
    }

    return true;
}

private static int findIndexOfString(List<CharSequence> list, String s) {
    for (int i = 0; i < list.size(); i++) {
        if (s.equals(list.get(i).toString().replaceAll(" ", ""))) {
            return i;
        }
    }

    return -1;
}

最佳答案

这是我用于根据从newValue接收的onPreferenceChange()对象设置摘要的代码,该对象包含作为首选项存储的值。(不利于总结)

public boolean onPreferenceChange(Preference preference, Object newValue) {
    if (preference instanceof MultiSelectListPreference) {
        List<String> newValues = new ArrayList<>((HashSet<String>) newValue);

        pref.setSummary(TextUtils.join(", ", getSummaryListFromValueList(newValues)));
    }

    return true;
}

private List<String> getSummaryListFromValueList(List<String> valueList) {
        String[] allSummaries = getResources().getStringArray(R.array.pref_notif);
        String[] allValues = getResources().getStringArray(R.array.pref_notif_values);

        List<String> summaryList = new ArrayList<>();
        for (int i = 0; i < allValues.length; i++) {
            for (String value : valueList) {
                if (allValues[i].equals(value)) {
                    summaryList.add(allSummaries[i]);
                }
            }
        }
        return summaryList;
    }

10-08 09:14