我是Android新手。我想在我的案例中使用MultiSelectListPreference。
但我遇到了一个问题:我的列表需要保持元素的顺序。假设有5个要素:
0 - Tom
1 - David
2 - Bob
3 - Mary
4 - Chris
并且用户选择0,2,3。然后列表必须按以下顺序排列:
汤姆,鲍勃,玛丽
但是MultiSelectListPreference存储Set<String>
中的设置,而不是ArrayList<String>
,所以由于Set
,它对此订单不确定。
如何确定此订单?谢谢。
答案 0 :(得分: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+" , ");
为我工作.. (代码致力于分叉@ https://github.com/li3ro/MultiSelectPref)