Reputation: 8350
Is there a way to iterate flat over all the preferences?
Right now I am asking for each preference
private void doSomething( Preference p ) {
if( p instanceof PreferenceCategory || p instanceof PreferenceScreen ) {
PreferenceGroup pGroup = (PreferenceGroup) p;
int pCount = pGroup.getPreferenceCount();
for(int i = 0; i < pCount; i++) {
doSomething(pGroup.getPreference(i)); // recursive call
}
} else {
... process single preference ...
}
}
I would like to do it this way:
int pCount = getTotalPreferenceCount();
for(int i = 0; i < pCount; i++) {
// process getFlatPreference(i);
}
Upvotes: 2
Views: 2964
Reputation: 1687
You also can use this approach (code inside PreferenceFragmentCompat):
for (String key : getPreferenceScreen().getSharedPreferences().getAll().keySet()) {
Preference p = findPreference(key);
if (p != null) //do smth with pref
}
Some useless iterations, but it's not a problem for my project
Upvotes: 1
Reputation: 2295
I'm not sure I see your problem with iterating though it this way, but if you want you could implement the following
private void callingMethod(){
ArrayList<Preference> list = getPreferenceList(prefScreen, new ArrayList<Preference>());
for (Preference p : list) {
doSomething(p);
}
}
private ArrayList<Preference> getPreferenceList(Preference p, ArrayList<Preference> list) {
if( p instanceof PreferenceCategory || p instanceof PreferenceScreen) {
PreferenceGroup pGroup = (PreferenceGroup) p;
int pCount = pGroup.getPreferenceCount();
for(int i = 0; i < pCount; i++) {
getPreferenceList(pGroup.getPreference(i), list); // recursive call
}
} else {
list.add(p);
}
return list;
}
this would allow you to make a flat preference list and then iterate through that list with a foreach loop.
Upvotes: 7