我需要應用程序中的設置,這些設置將在幾個名稱庫中提供(全部位於一個項目中)。我desided用類似的方法創建類:SharedPreferenses不保存狀態
private SharedPreferences prefs;
private Context context;
public Preferenses(Context context){
this.context=context;
}
public void invertLanguageState(String lang){
prefs=context.getSharedPreferences(LEARN_WORDS_PREFS, Context.MODE_PRIVATE);
boolean state=prefs.getBoolean(lang, false);
Editor editor=prefs.edit();
editor.putBoolean(lang,!state);
editor.commit();
}
public void setLanguagesStates(String []langs,boolean []states){
prefs=context.getSharedPreferences(LEARN_WORDS_PREFS, Context.MODE_PRIVATE);
Editor editor=prefs.edit();
final int size=states.length;
for(int i=0;i<size;i++){
editor.putBoolean(langs[i],states[i]);
}
editor.commit();
}
public boolean [] getLanguagesStates(String []keys){
prefs=context.getSharedPreferences(LEARN_WORDS_PREFS,Context.MODE_PRIVATE);
final int size=keys.length;
boolean [] states=new boolean[size];
for(int i=0;i<size;i++){
states[i]=prefs.getBoolean(keys[i], false);
}
return states;
}
然後我嘗試使用它ListActivity,我寫我的適配器代碼:
public class UsableLanguagesAdapter extends ArrayAdapter<String>{
private final Context context;
private final String [] values;
private boolean [] states; // language states in checkbox (select or not)
private Preferenses prefs;
public UsableLanguagesAdapter(Context context,String []values) {
super(context,RProvider.getLanguageUserItem(),values);
this.context=context;
this.values=values;
this.prefs=new Preferenses(context);
this.states=prefs.getLanguagesStates(values);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(RProvider.getLanguageUserItem(), parent, false);
CheckBox checkBox=(CheckBox) rowView.findViewById(RProvider.getLanguageItemCheckBox());
TextView textView = (TextView) rowView.findViewById(RProvider.getLanguageItemText());
ImageView imageView = (ImageView) rowView.findViewById(RProvider.getLanguageItemImage());
imageView.setImageResource(RProvider.getLangImageId(values[position]));
textView.setText(values[position]);
checkBox.setSelected(states[position]);
final int pos=position;
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
Boolean state=prefs.getLangugeState(values[pos]);
Log.d(state.toString(),"show state");
prefs.invertLanguageState(values[pos]);
state=prefs.getLangugeState(values[pos]);
Log.d(state.toString(),"show state");
///checkBox.setSelected(isChecked);
}
});
return rowView;
}
}
但unforchantly當我重裝活動,所有複選框都未選中。你能說我如何解決這個問題嗎?此外,這一結果在其他活動中也是必要的。
states是布爾數組 – Abbath
@Abbath is states [position] boolean? – Blackbelt