1

我是安卓新手。我想为我的案例使用 MultiSelectListPreference。

但是我遇到了一个问题:我的列表需要保持元素的顺序。假设有5个元素:

0 - Tom
1 - David
2 - Bob
3 - Mary
4 - Chris

并且用户选择0、2、3。那么列表必须按以下顺序排列:

汤姆、鲍勃、玛丽

但是 MultiSelectListPreference 将设置存储在 中Set<String>,而不是ArrayList<String>,因此不确定此顺序,因为Set.

我怎样才能确定这个订单?谢谢你。

4

1 回答 1

1

camdaochemgio,我什至在您编辑之前就理解了您的问题。

由于我们谈论的是 Set(存储唯一值),因此需要将此 getValues() 函数输入到您自己的 revertValues 函数中,该函数根据您对数据的预设将值转换为索引。我要求您提供代码,以便我可以通过以您自己的风格/术语编写解决方案来表达自己。

解决方案:

我在MultiSelectListPreference的文档中注意到以下方法:

int findIndexOfValue(String value)

但是您没有存储对对象的此类引用,所以我创建了这个类来扩展 MultiSelectListPreference(在新文件中!):

public class DataHolder extends MultiSelectListPreference {

    // note: AttributeSet  is needed in super class
    public DataHolder(Context context,AttributeSet attrs) {   
        super(context, attrs);

        List<CharSequence> entries = new ArrayList<CharSequence>();
        List<CharSequence> entriesValues = new ArrayList<CharSequence>();

        /** We could use the String Array like you did in your Q, 
         * But I preffer this way of populating data - 
         * It keeps things open and unlimitted.
         * If you really want the data picked up from the xml , just use : 
         * context.getResources().getStringArray(R.array.entries)  and
         * context.getResources().getStringArray(R.array.entryValues) 
         * */

        entries.add("0");
        entries.add("1");
        entries.add("2");
        entries.add("3");
        entries.add("4");
        entriesValues.add("Tom");
        entriesValues.add("David");
        entriesValues.add("Bob");
        entriesValues.add("Mary");
        entriesValues.add("Chris");

        setEntries(entries.toArray(new CharSequence[5]));
        setEntryValues(entriesValues.toArray(new CharSequence[5]));
    }
}

现在我们需要将它插入你的监听器。在您的 SettingsFragment 类中,只需添加一个新字段:

private DataHolder dh = null;

并更改构造函数以接受并初始化它:

public SettingsFragment(Context c) {
    dh = new DataHolder(c,null);
}

下一步:从 xml 中删除对数据的引用。现在应该是这样的:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <com.example.multiselectpref.DataHolder
        android:key="pref_key_name_choice"
        android:title="@string/name_choice"
    />
</PreferenceScreen>

回到您的听众,在 onSharedPreferenceChanged 方法中,您可以将 toast 更改为:

toast_message += (dh.findIndexOfValue(name) + ": "+name+"    , ");

对我有用..(提交给 fork @ https://github.com/li3ro/MultiSelectPref的代码)

于 2014-10-11T16:03:58.543 回答